Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0a9f7d8

Browse files
committed
Removed global variables.
1 parent e5bdf71 commit 0a9f7d8

File tree

5 files changed

+212
-62
lines changed

5 files changed

+212
-62
lines changed

common.h

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@
4343
fold_item *f1 = malloc(sizeof(fold_item)); \
4444
f1->fun = (void *)callback; \
4545
f1->next = NULL; \
46+
fold_item *current = get_multi_current(getThis());\
4647
if(current) current->next = f1; \
47-
current = f1; \
48+
set_multi_current(getThis(), f1); \
4849
}
4950

5051
#define PIPELINE_ENQUEUE_COMMAND(cmd, cmd_len) request_item *tmp; \
@@ -53,12 +54,15 @@
5354
memcpy(tmp->request_str, cmd, cmd_len);\
5455
tmp->request_size = cmd_len;\
5556
tmp->next = NULL;\
57+
zval *z_this = getThis(); \
58+
struct request_item *current_request = get_pipeline_current(z_this); \
5659
if(current_request) {\
5760
current_request->next = tmp;\
5861
} \
59-
current_request = tmp; \
60-
if(NULL == head_request) { \
61-
head_request = current_request; \
62+
set_pipeline_current(z_this, tmp); \
63+
if(NULL == get_pipeline_head(z_this)) { \
64+
set_pipeline_head(z_this, get_pipeline_current(z_this)); \
65+
/* head_request = current_request;*/ \
6266
}
6367

6468
#define SOCKET_WRITE_COMMAND(redis_sock, cmd, cmd_len) if(redis_sock_write(redis_sock, cmd, cmd_len) < 0) { \
@@ -70,10 +74,12 @@
7074
fold_item *f1 = malloc(sizeof(fold_item)); \
7175
f1->fun = (void *)callback; \
7276
f1->next = NULL; \
77+
fold_item *current = get_multi_current(getThis());\
7378
if(current) current->next = f1; \
74-
current = f1; \
75-
if(NULL == head) { \
76-
head = current; \
79+
set_multi_current(getThis(), f1); \
80+
if(NULL == get_multi_head(getThis())) { \
81+
/* head = current;*/ \
82+
set_multi_head(getThis(), get_multi_current(getThis()));\
7783
}\
7884
}
7985

@@ -121,14 +127,14 @@ typedef struct fold_item {
121127
zval * (*fun)(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, ...);
122128
struct fold_item *next;
123129
} fold_item;
124-
fold_item *head, *current;
130+
//fold_item *head, *current;
125131

126132
typedef struct request_item {
127133
char *request_str;
128134
int request_size; /* size_t */
129135
struct request_item *next;
130136
} request_item;
131-
request_item *head_request, *current_request;
137+
// request_item *head_request, *current_request;
132138

133139
void
134140
free_reply_callbacks();

library.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
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+
712
PHPAPI void redis_check_eof(RedisSock *redis_sock TSRMLS_DC)
813
{
914

@@ -616,3 +621,92 @@ PHPAPI void redis_free_socket(RedisSock *redis_sock)
616621
efree(redis_sock->host);
617622
efree(redis_sock);
618623
}
624+
625+
626+
PHPAPI fold_item* get_multi_head(zval *object) {
627+
628+
zval **multi_head = NULL;
629+
int type;
630+
631+
zend_hash_find(Z_OBJPROP_P(object), "multi_head", sizeof("multi_head"), (void **) &multi_head);
632+
return zend_list_find(Z_LVAL_PP(multi_head), &type);
633+
}
634+
635+
PHPAPI void set_multi_head(zval *object, fold_item *head) {
636+
637+
zval **multi_head = NULL;
638+
639+
zend_hash_find(Z_OBJPROP_P(object), "multi_head", sizeof("multi_head"), (void **) &multi_head);
640+
if(multi_head) { /* replace */
641+
zend_list_delete(Z_LVAL_PP(multi_head));
642+
}
643+
644+
int list_id = zend_list_insert(head, le_redis_multi_head);
645+
add_property_resource(object, "multi_head", list_id);
646+
}
647+
648+
PHPAPI fold_item* get_multi_current(zval *object) {
649+
650+
zval **multi_current = NULL;
651+
int type;
652+
653+
zend_hash_find(Z_OBJPROP_P(object), "multi_current", sizeof("multi_current"), (void **) &multi_current);
654+
return zend_list_find(Z_LVAL_PP(multi_current), &type);
655+
}
656+
657+
PHPAPI void set_multi_current(zval *object, fold_item *current) {
658+
659+
zval **multi_current = NULL;
660+
661+
zend_hash_find(Z_OBJPROP_P(object), "multi_current", sizeof("multi_current"), (void **) &multi_current);
662+
if(multi_current) { /* replace */
663+
zend_list_delete(Z_LVAL_PP(multi_current));
664+
}
665+
666+
int list_id = zend_list_insert(current, le_redis_multi_current);
667+
add_property_resource(object, "multi_current", list_id);
668+
}
669+
670+
PHPAPI request_item* get_pipeline_head(zval *object) {
671+
672+
zval **pipeline_head = NULL;
673+
int type;
674+
675+
zend_hash_find(Z_OBJPROP_P(object), "pipeline_head", sizeof("pipeline_head"), (void **) &pipeline_head);
676+
return zend_list_find(Z_LVAL_PP(pipeline_head), &type);
677+
}
678+
679+
PHPAPI void set_pipeline_head(zval *object, request_item *head) {
680+
681+
zval **pipeline_head = NULL;
682+
683+
zend_hash_find(Z_OBJPROP_P(object), "pipeline_head", sizeof("pipeline_head"), (void **) &pipeline_head);
684+
if(pipeline_head) { /* replace */
685+
zend_list_delete(Z_LVAL_PP(pipeline_head));
686+
}
687+
688+
int list_id = zend_list_insert(head, le_redis_pipeline_head);
689+
add_property_resource(object, "pipeline_head", list_id);
690+
}
691+
692+
PHPAPI request_item* get_pipeline_current(zval *object) {
693+
694+
zval **pipeline_current = NULL;
695+
int type;
696+
697+
zend_hash_find(Z_OBJPROP_P(object), "pipeline_current", sizeof("pipeline_current"), (void **) &pipeline_current);
698+
return zend_list_find(Z_LVAL_PP(pipeline_current), &type);
699+
}
700+
701+
PHPAPI void set_pipeline_current(zval *object, request_item *current) {
702+
703+
zval **pipeline_current = NULL;
704+
705+
zend_hash_find(Z_OBJPROP_P(object), "pipeline_current", sizeof("pipeline_current"), (void **) &pipeline_current);
706+
if(pipeline_current) { /* replace */
707+
zend_list_delete(Z_LVAL_PP(pipeline_current));
708+
}
709+
710+
int list_id = zend_list_insert(current, le_redis_pipeline_current);
711+
add_property_resource(object, "pipeline_current", list_id);
712+
}

php_redis.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,18 @@ PHPAPI int redis_response_enqueued(RedisSock *redis_sock TSRMLS_DC);
149149
PHPAPI int get_flag(zval *object);
150150
PHPAPI void set_flag(zval *object, int new_flag);
151151

152+
/* MULTI/EXEC */
153+
PHPAPI fold_item* get_multi_head(zval *object);
154+
PHPAPI void set_multi_head(zval *object, fold_item *head);
155+
PHPAPI fold_item* get_multi_current(zval *object);
156+
PHPAPI void set_multi_current(zval *object, fold_item *current);
157+
158+
/* pipeline */
159+
PHPAPI request_item* get_pipeline_head(zval *object);
160+
PHPAPI void set_pipeline_head(zval *object, request_item *head);
161+
PHPAPI request_item* get_pipeline_current(zval *object);
162+
PHPAPI void set_pipeline_current(zval *object, request_item *current);
163+
152164
ZEND_BEGIN_MODULE_GLOBALS(redis)
153165
ZEND_END_MODULE_GLOBALS(redis)
154166

redis.c

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636

3737
static int le_redis_sock;
3838
static int le_redis_multi_access_type;
39+
int le_redis_multi_head;
40+
int le_redis_multi_current;
41+
int le_redis_pipeline_head;
42+
int le_redis_pipeline_current;
3943

4044
static zend_class_entry *redis_ce;
4145
static zend_class_entry *redis_exception_ce;
@@ -274,6 +278,30 @@ PHP_MINIT_FUNCTION(redis)
274278
redis_multi_access_type_name, module_number
275279
);
276280

281+
le_redis_multi_head = zend_register_list_destructors_ex(
282+
redis_destructor_multi_access,
283+
NULL,
284+
redis_multi_access_type_name, module_number
285+
);
286+
287+
le_redis_multi_current = zend_register_list_destructors_ex(
288+
redis_destructor_multi_access,
289+
NULL,
290+
redis_multi_access_type_name, module_number
291+
);
292+
293+
le_redis_pipeline_head = zend_register_list_destructors_ex(
294+
redis_destructor_multi_access,
295+
NULL,
296+
redis_multi_access_type_name, module_number
297+
);
298+
299+
le_redis_pipeline_current = zend_register_list_destructors_ex(
300+
redis_destructor_multi_access,
301+
NULL,
302+
redis_multi_access_type_name, module_number
303+
);
304+
277305
add_constant_long(redis_ce, "REDIS_NOT_FOUND", REDIS_NOT_FOUND);
278306
add_constant_long(redis_ce, "REDIS_STRING", REDIS_STRING);
279307
add_constant_long(redis_ce, "REDIS_SET", REDIS_SET);
@@ -336,6 +364,10 @@ PHP_METHOD(Redis, __construct)
336364
add_property_resource(object, "multi_flag", id);
337365

338366
set_flag(object, REDIS_ATOMIC);
367+
set_multi_head(object, NULL);
368+
set_multi_current(object, NULL);
369+
set_pipeline_head(object, NULL);
370+
set_pipeline_current(object, NULL);
339371

340372
}
341373
/* }}} */
@@ -361,6 +393,7 @@ PHPAPI void set_flag(zval *object, int new_flag)
361393
add_property_resource(object, "multi_flag", id);
362394

363395
}
396+
364397
/* {{{ proto boolean Redis::connect(string host, int port [, int timeout])
365398
*/
366399
PHP_METHOD(Redis, connect)
@@ -3973,7 +4006,7 @@ PHP_METHOD(Redis, multi)
39734006
RETURN_FALSE;
39744007
}
39754008

3976-
current = NULL;
4009+
set_multi_current(getThis(), NULL); /* current = NULL; */
39774010

39784011
IF_MULTI() {
39794012
cmd_len = redis_cmd_format(&cmd, "*1" _NL "$5" _NL "MULTI" _NL);
@@ -3996,7 +4029,7 @@ PHP_METHOD(Redis, multi)
39964029
RETURN_FALSE;
39974030
}
39984031
IF_PIPELINE() {
3999-
free_reply_callbacks();
4032+
free_reply_callbacks(getThis());
40004033
RETURN_ZVAL(getThis(), 1, 0);
40014034
}
40024035
}
@@ -4052,7 +4085,7 @@ PHPAPI int redis_sock_read_multibulk_pipeline_reply(INTERNAL_FUNCTION_PARAMETERS
40524085
efree(z_tab);
40534086

40544087
/* free allocated function/request memory */
4055-
free_reply_callbacks();
4088+
free_reply_callbacks(getThis());
40564089

40574090
return 0;
40584091

@@ -4090,25 +4123,28 @@ PHPAPI int redis_sock_read_multibulk_multi_reply(INTERNAL_FUNCTION_PARAMETERS,
40904123
}
40914124

40924125
void
4093-
free_reply_callbacks() {
4126+
free_reply_callbacks(zval *z_this) {
40944127

40954128
fold_item *fi;
4129+
fold_item *head = get_multi_head(z_this);
40964130
for(fi = head; fi; ) {
40974131
fold_item *fi_next = fi->next;
40984132
free(fi);
40994133
fi = fi_next;
41004134
}
4101-
head = current = NULL;
4135+
set_multi_head(z_this, NULL);
4136+
set_multi_current(z_this, NULL);
41024137

41034138

41044139
request_item *ri;
4105-
for(ri = head_request; ri; ) {
4140+
for(ri = get_pipeline_head(z_this); ri; ) {
41064141
struct request_item *ri_next = ri->next;
41074142
free(ri->request_str);
41084143
free(ri);
41094144
ri = ri_next;
41104145
}
4111-
current_request = head_request = NULL;
4146+
set_pipeline_head(z_this, NULL);
4147+
set_pipeline_current(z_this, NULL);
41124148

41134149
}
41144150

@@ -4142,10 +4178,10 @@ PHP_METHOD(Redis, exec)
41424178

41434179
if (redis_sock_read_multibulk_multi_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock TSRMLS_CC) < 0) {
41444180
zval_dtor(return_value);
4145-
free_reply_callbacks();
4181+
free_reply_callbacks(object);
41464182
RETURN_FALSE;
41474183
}
4148-
free_reply_callbacks();
4184+
free_reply_callbacks(object);
41494185
set_flag(object, REDIS_ATOMIC);
41504186
}
41514187

@@ -4156,41 +4192,41 @@ PHP_METHOD(Redis, exec)
41564192
int offset = 0;
41574193

41584194
/* compute the total request size */
4159-
for(ri = head_request; ri; ri = ri->next) {
4195+
for(ri = get_pipeline_head(object); ri; ri = ri->next) {
41604196
total += ri->request_size;
41614197
}
41624198
if(total) {
41634199
request = malloc(total);
41644200
}
41654201

41664202
/* concatenate individual elements one by one in the target buffer */
4167-
for(ri = head_request; ri; ri = ri->next) {
4203+
for(ri = get_pipeline_head(object); ri; ri = ri->next) {
41684204
memcpy(request + offset, ri->request_str, ri->request_size);
41694205
offset += ri->request_size;
41704206
}
41714207

41724208
if(request != NULL) {
41734209
if (redis_sock_write(redis_sock, request, total) < 0) {
41744210
free(request);
4175-
free_reply_callbacks();
4211+
free_reply_callbacks(object);
41764212
set_flag(object, REDIS_ATOMIC);
41774213
RETURN_FALSE;
41784214
}
41794215
free(request);
41804216
} else {
41814217
set_flag(object, REDIS_ATOMIC);
4182-
free_reply_callbacks();
4218+
free_reply_callbacks(object);
41834219
array_init(return_value); /* empty array when no command was run. */
41844220
return;
41854221
}
41864222

41874223
if (redis_sock_read_multibulk_pipeline_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock TSRMLS_CC) < 0) {
41884224
set_flag(object, REDIS_ATOMIC);
4189-
free_reply_callbacks();
4225+
free_reply_callbacks(object);
41904226
RETURN_FALSE;
41914227
}
41924228
set_flag(object, REDIS_ATOMIC);
4193-
free_reply_callbacks();
4229+
free_reply_callbacks(object);
41944230
}
41954231
}
41964232

@@ -4202,9 +4238,12 @@ PHPAPI int redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAMETE
42024238
RedisSock *redis_sock, zval *z_tab, int numElems TSRMLS_DC)
42034239
{
42044240

4241+
fold_item *head = get_multi_head(getThis());
4242+
fold_item *current = get_multi_current(getThis());
42054243
for(current = head; current; current = current->next) {
42064244
fold_this_item(INTERNAL_FUNCTION_PARAM_PASSTHRU, current, redis_sock, z_tab TSRMLS_CC);
42074245
}
4246+
set_multi_current(getThis(), current);
42084247
return 0;
42094248
}
42104249

@@ -4229,7 +4268,7 @@ PHP_METHOD(Redis, pipeline)
42294268
We need the response format of the n - 1 command. So, we can delete when n > 2, the { 1 .. n - 2} commands
42304269
*/
42314270

4232-
free_reply_callbacks();
4271+
free_reply_callbacks(getThis());
42334272

42344273
RETURN_ZVAL(getThis(), 1, 0);
42354274
}

0 commit comments

Comments
 (0)