Skip to content

Commit b5c9d0c

Browse files
committed
More improvements on MULTI/EXEC.
1 parent c697ca1 commit b5c9d0c

File tree

3 files changed

+24
-69
lines changed

3 files changed

+24
-69
lines changed

common.h

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,14 @@
1515
#define REDIS_SET 2
1616
#define REDIS_LIST 3
1717

18-
#define REDIS_ATOMIC 0
19-
#define REDIS_MULTI 1
20-
#define REDIS_PIPELINE 2
21-
22-
#define IF_MULTI() if(get_flag(object TSRMLS_CC) == REDIS_MULTI)
23-
#define IF_MULTI_OR_ATOMIC() if(get_flag(object TSRMLS_CC) == REDIS_MULTI || get_flag(object TSRMLS_CC) == REDIS_ATOMIC)\
24-
25-
#define IF_MULTI_OR_PIPELINE() if(get_flag(object TSRMLS_CC) == REDIS_MULTI || get_flag(object TSRMLS_CC) == REDIS_PIPELINE)
26-
#define IF_PIPELINE() if(get_flag(object TSRMLS_CC) == REDIS_PIPELINE)
27-
#define IF_NOT_MULTI() if(get_flag(object TSRMLS_CC) != REDIS_MULTI)
28-
#define IF_ATOMIC() if(get_flag(object TSRMLS_CC) == REDIS_ATOMIC)
29-
#define ELSE_IF_MULTI() else if(get_flag(object TSRMLS_CC) == REDIS_MULTI) { \
18+
#define IF_MULTI() if(redis_sock->mode == MULTI)
19+
#define IF_MULTI_OR_ATOMIC() if(redis_sock->mode == MULTI || redis_sock->mode == ATOMIC)\
20+
21+
#define IF_MULTI_OR_PIPELINE() if(redis_sock->mode == MULTI || redis_sock->mode == PIPELINE)
22+
#define IF_PIPELINE() if(redis_sock->mode == PIPELINE)
23+
#define IF_NOT_MULTI() if(redis_sock->mode != MULTI)
24+
#define IF_ATOMIC() if(redis_sock->mode == ATOMIC)
25+
#define ELSE_IF_MULTI() else if(redis_sock->mode == MULTI) { \
3026
if(redis_response_enqueued(redis_sock TSRMLS_CC) == 1) {\
3127
RETURN_ZVAL(getThis(), 1, 0);\
3228
} else {\
@@ -84,7 +80,7 @@
8480
}
8581

8682
#define REDIS_ELSE_IF_MULTI(function) \
87-
else if(get_flag(object TSRMLS_CC) == REDIS_MULTI) { \
83+
else if(redis_sock->mode == MULTI) { \
8884
if(redis_response_enqueued(redis_sock TSRMLS_CC) == 1) {\
8985
REDIS_SAVE_CALLBACK(function); \
9086
RETURN_ZVAL(getThis(), 1, 0);\

library.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,6 @@
44
#include <netinet/tcp.h> /* TCP_NODELAY */
55
#include <sys/socket.h>
66

7-
extern int le_redis_multi_head;
8-
extern int le_redis_multi_current;
9-
extern int le_redis_pipeline_head;
10-
extern int le_redis_pipeline_current;
11-
127
PHPAPI void redis_check_eof(RedisSock *redis_sock TSRMLS_DC)
138
{
149

redis.c

Lines changed: 15 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
#define R_SUB_CALLBACK_FT_TYPE 2
3636

3737
static int le_redis_sock;
38-
static int le_redis_multi_access_type;
3938

4039
static zend_class_entry *redis_ce;
4140
static zend_class_entry *redis_exception_ce;
@@ -271,20 +270,14 @@ PHP_MINIT_FUNCTION(redis)
271270
redis_sock_name, module_number
272271
);
273272

274-
le_redis_multi_access_type = zend_register_list_destructors_ex(
275-
redis_destructor_multi_access,
276-
NULL,
277-
redis_multi_access_type_name, module_number
278-
);
279-
280273
add_constant_long(redis_ce, "REDIS_NOT_FOUND", REDIS_NOT_FOUND);
281274
add_constant_long(redis_ce, "REDIS_STRING", REDIS_STRING);
282275
add_constant_long(redis_ce, "REDIS_SET", REDIS_SET);
283276
add_constant_long(redis_ce, "REDIS_LIST", REDIS_LIST);
284277

285-
add_constant_long(redis_ce, "ATOMIC", REDIS_ATOMIC);
286-
add_constant_long(redis_ce, "MULTI", REDIS_MULTI);
287-
add_constant_long(redis_ce, "PIPELINE", REDIS_PIPELINE);
278+
add_constant_long(redis_ce, "ATOMIC", ATOMIC);
279+
add_constant_long(redis_ce, "MULTI", MULTI);
280+
add_constant_long(redis_ce, "PIPELINE", PIPELINE);
288281

289282
return SUCCESS;
290283
}
@@ -333,37 +326,8 @@ PHP_METHOD(Redis, __construct)
333326
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) {
334327
RETURN_FALSE;
335328
}
336-
int multi_flag = 0, id;
337-
object = getThis();
338-
id = zend_list_insert(&multi_flag, le_redis_multi_access_type);
339-
add_property_resource(object, "multi_flag", id);
340-
341-
set_flag(object, REDIS_ATOMIC TSRMLS_CC);
342-
343329
}
344330
/* }}} */
345-
PHPAPI int get_flag(zval *object TSRMLS_DC)
346-
{
347-
zval **multi_flag;
348-
int flag, flag_result;
349-
350-
zend_hash_find(Z_OBJPROP_P(object), "multi_flag", sizeof("multi_flag"), (void **) &multi_flag);
351-
flag = (int)(long)zend_list_find(Z_LVAL_PP(multi_flag), &flag_result);
352-
353-
return flag;
354-
}
355-
356-
PHPAPI void set_flag(zval *object, int new_flag TSRMLS_DC)
357-
{
358-
zval **multi_flag = NULL;
359-
360-
zend_hash_find(Z_OBJPROP_P(object), "multi_flag", sizeof("multi_flag"), (void **) &multi_flag);
361-
zend_list_delete(Z_LVAL_PP(multi_flag));
362-
363-
int id = zend_list_insert((void *)(long)new_flag, le_redis_multi_access_type);
364-
add_property_resource(object, "multi_flag", id);
365-
366-
}
367331

368332
/* {{{ proto boolean Redis::connect(string host, int port [, int timeout])
369333
*/
@@ -4193,7 +4157,7 @@ PHPAPI int redis_response_enqueued(RedisSock *redis_sock TSRMLS_DC) {
41934157
return ret;
41944158
}
41954159

4196-
/* flag : get, set {REDIS_ATOMIC, REDIS_MULTI, REDIS_PIPELINE} */
4160+
/* flag : get, set {ATOMIC, MULTI, PIPELINE} */
41974161

41984162
PHP_METHOD(Redis, multi)
41994163
{
@@ -4203,7 +4167,7 @@ PHP_METHOD(Redis, multi)
42034167
int response_len, cmd_len;
42044168
char * response;
42054169
zval *object;
4206-
long multi_value = REDIS_MULTI;
4170+
long multi_value = MULTI;
42074171

42084172
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l",
42094173
&object, redis_ce, &multi_value) == FAILURE) {
@@ -4216,8 +4180,8 @@ PHP_METHOD(Redis, multi)
42164180
RETURN_FALSE;
42174181
}
42184182

4219-
if(multi_value == REDIS_MULTI || multi_value == REDIS_PIPELINE) {
4220-
set_flag(object, multi_value TSRMLS_CC);
4183+
if(multi_value == MULTI || multi_value == PIPELINE) {
4184+
redis_sock->mode = multi_value;
42214185
} else {
42224186
RETURN_FALSE;
42234187
}
@@ -4264,7 +4228,7 @@ PHP_METHOD(Redis, discard)
42644228
RETURN_FALSE;
42654229
}
42664230

4267-
set_flag(object, 0 TSRMLS_CC);
4231+
redis_sock->mode = ATOMIC;
42684232

42694233
if (redis_sock_get(object, &redis_sock TSRMLS_CC) < 0) {
42704234
RETURN_FALSE;
@@ -4395,11 +4359,11 @@ PHP_METHOD(Redis, exec)
43954359
if (redis_sock_read_multibulk_multi_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock) < 0) {
43964360
zval_dtor(return_value);
43974361
free_reply_callbacks(object, redis_sock);
4398-
set_flag(object, REDIS_ATOMIC TSRMLS_CC);
4362+
redis_sock->mode = ATOMIC;
43994363
RETURN_FALSE;
44004364
}
44014365
free_reply_callbacks(object, redis_sock);
4402-
set_flag(object, REDIS_ATOMIC TSRMLS_CC);
4366+
redis_sock->mode = ATOMIC;
44034367
}
44044368

44054369
IF_PIPELINE() {
@@ -4426,23 +4390,23 @@ PHP_METHOD(Redis, exec)
44264390
if (redis_sock_write(redis_sock, request, total) < 0) {
44274391
free(request);
44284392
free_reply_callbacks(object, redis_sock);
4429-
set_flag(object, REDIS_ATOMIC TSRMLS_CC);
4393+
redis_sock->mode = ATOMIC;
44304394
RETURN_FALSE;
44314395
}
44324396
free(request);
44334397
} else {
4434-
set_flag(object, REDIS_ATOMIC TSRMLS_CC);
4398+
redis_sock->mode = ATOMIC;
44354399
free_reply_callbacks(object, redis_sock);
44364400
array_init(return_value); /* empty array when no command was run. */
44374401
return;
44384402
}
44394403

44404404
if (redis_sock_read_multibulk_pipeline_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock) < 0) {
4441-
set_flag(object, REDIS_ATOMIC TSRMLS_CC);
4405+
redis_sock->mode = ATOMIC;
44424406
free_reply_callbacks(object, redis_sock);
44434407
RETURN_FALSE;
44444408
}
4445-
set_flag(object, REDIS_ATOMIC TSRMLS_CC);
4409+
redis_sock->mode = ATOMIC;
44464410
free_reply_callbacks(object, redis_sock);
44474411
}
44484412
}
@@ -4478,7 +4442,7 @@ PHP_METHOD(Redis, pipeline)
44784442
if (redis_sock_get(object, &redis_sock TSRMLS_CC) < 0) {
44794443
RETURN_FALSE;
44804444
}
4481-
set_flag(object, REDIS_PIPELINE TSRMLS_CC);
4445+
redis_sock->mode = PIPELINE;
44824446

44834447
/*
44844448
NB : we keep the function fold, to detect the last function.

0 commit comments

Comments
 (0)