Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2019-01-09 11:43:19 +0300
committerPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2019-01-09 11:43:19 +0300
commite98f51165bba319e27003af1a21022cffcc285de (patch)
tree1bb8d85723f1cd4442996dc6ed8515811b954bdf /common.h
parentabb79ccb8385da07aeb815acf8550c41171ce0c7 (diff)
Use zend_string for pipeline_cmd
Diffstat (limited to 'common.h')
-rw-r--r--common.h34
1 files changed, 25 insertions, 9 deletions
diff --git a/common.h b/common.h
index adbe3035..9642fdd4 100644
--- a/common.h
+++ b/common.h
@@ -34,7 +34,7 @@ zend_string_alloc(size_t len, int persistent)
zend_string *zstr = emalloc(sizeof(*zstr) + len + 1);
ZSTR_VAL(zstr) = (char *)zstr + sizeof(*zstr);
- zstr->len = len;
+ ZSTR_LEN(zstr) = len;
zstr->gc = 0x01;
return zstr;
}
@@ -49,6 +49,25 @@ zend_string_init(const char *str, size_t len, int persistent)
return zstr;
}
+static zend_always_inline zend_string *
+zend_string_realloc(zend_string *s, size_t len, int persistent)
+{
+ zend_string *zstr;
+
+ if (!s->gc) {
+ zstr = zend_string_init(ZSTR_VAL(s), len, 0);
+ } else if (s->gc & 0x10) {
+ ZSTR_VAL(s) = erealloc(ZSTR_VAL(s), len + 1);
+ ZSTR_LEN(s) = len;
+ zstr = s;
+ } else {
+ zstr = erealloc(s, sizeof(*zstr) + len + 1);
+ ZSTR_VAL(zstr) = (char *)zstr + sizeof(*zstr);
+ ZSTR_LEN(zstr) = len;
+ }
+ return zstr;
+}
+
#define zend_string_equal_val(s1, s2) !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1))
#define zend_string_equal_content(s1, s2) (ZSTR_LEN(s1) == ZSTR_LEN(s2) && zend_string_equal_val(s1, s2))
#define zend_string_equals(s1, s2) (s1 == s2 || zend_string_equal_content(s1, s2))
@@ -533,14 +552,12 @@ typedef enum _PUBSUB_TYPE {
#define PIPELINE_ENQUEUE_COMMAND(cmd, cmd_len) do { \
if (redis_sock->pipeline_cmd == NULL) { \
- redis_sock->pipeline_cmd = estrndup(cmd, cmd_len); \
+ redis_sock->pipeline_cmd = zend_string_init(cmd, cmd_len, 0); \
} else { \
- redis_sock->pipeline_cmd = erealloc(redis_sock->pipeline_cmd, \
- redis_sock->pipeline_len + cmd_len); \
- memcpy(&redis_sock->pipeline_cmd[redis_sock->pipeline_len], \
- cmd, cmd_len); \
+ size_t pipeline_len = ZSTR_LEN(redis_sock->pipeline_cmd); \
+ redis_sock->pipeline_cmd = zend_string_realloc(redis_sock->pipeline_cmd, pipeline_len + cmd_len, 0); \
+ memcpy(&ZSTR_VAL(redis_sock->pipeline_cmd)[pipeline_len], cmd, cmd_len); \
} \
- redis_sock->pipeline_len += cmd_len; \
} while (0)
#define SOCKET_WRITE_COMMAND(redis_sock, cmd, cmd_len) \
@@ -675,8 +692,7 @@ typedef struct {
fold_item *head;
fold_item *current;
- char *pipeline_cmd;
- size_t pipeline_len;
+ zend_string *pipeline_cmd;
zend_string *err;