36
36
37
37
static int le_redis_sock ;
38
38
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 ;
39
43
40
44
static zend_class_entry * redis_ce ;
41
45
static zend_class_entry * redis_exception_ce ;
@@ -274,6 +278,30 @@ PHP_MINIT_FUNCTION(redis)
274
278
redis_multi_access_type_name , module_number
275
279
);
276
280
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
+
277
305
add_constant_long (redis_ce , "REDIS_NOT_FOUND" , REDIS_NOT_FOUND );
278
306
add_constant_long (redis_ce , "REDIS_STRING" , REDIS_STRING );
279
307
add_constant_long (redis_ce , "REDIS_SET" , REDIS_SET );
@@ -336,6 +364,10 @@ PHP_METHOD(Redis, __construct)
336
364
add_property_resource (object , "multi_flag" , id );
337
365
338
366
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 );
339
371
340
372
}
341
373
/* }}} */
@@ -361,6 +393,7 @@ PHPAPI void set_flag(zval *object, int new_flag)
361
393
add_property_resource (object , "multi_flag" , id );
362
394
363
395
}
396
+
364
397
/* {{{ proto boolean Redis::connect(string host, int port [, int timeout])
365
398
*/
366
399
PHP_METHOD (Redis , connect )
@@ -3973,7 +4006,7 @@ PHP_METHOD(Redis, multi)
3973
4006
RETURN_FALSE ;
3974
4007
}
3975
4008
3976
- current = NULL ;
4009
+ set_multi_current ( getThis (), NULL ); /* current = NULL; */
3977
4010
3978
4011
IF_MULTI () {
3979
4012
cmd_len = redis_cmd_format (& cmd , "*1" _NL "$5" _NL "MULTI" _NL );
@@ -3996,7 +4029,7 @@ PHP_METHOD(Redis, multi)
3996
4029
RETURN_FALSE ;
3997
4030
}
3998
4031
IF_PIPELINE () {
3999
- free_reply_callbacks ();
4032
+ free_reply_callbacks (getThis () );
4000
4033
RETURN_ZVAL (getThis (), 1 , 0 );
4001
4034
}
4002
4035
}
@@ -4052,7 +4085,7 @@ PHPAPI int redis_sock_read_multibulk_pipeline_reply(INTERNAL_FUNCTION_PARAMETERS
4052
4085
efree (z_tab );
4053
4086
4054
4087
/* free allocated function/request memory */
4055
- free_reply_callbacks ();
4088
+ free_reply_callbacks (getThis () );
4056
4089
4057
4090
return 0 ;
4058
4091
@@ -4090,25 +4123,28 @@ PHPAPI int redis_sock_read_multibulk_multi_reply(INTERNAL_FUNCTION_PARAMETERS,
4090
4123
}
4091
4124
4092
4125
void
4093
- free_reply_callbacks () {
4126
+ free_reply_callbacks (zval * z_this ) {
4094
4127
4095
4128
fold_item * fi ;
4129
+ fold_item * head = get_multi_head (z_this );
4096
4130
for (fi = head ; fi ; ) {
4097
4131
fold_item * fi_next = fi -> next ;
4098
4132
free (fi );
4099
4133
fi = fi_next ;
4100
4134
}
4101
- head = current = NULL ;
4135
+ set_multi_head (z_this , NULL );
4136
+ set_multi_current (z_this , NULL );
4102
4137
4103
4138
4104
4139
request_item * ri ;
4105
- for (ri = head_request ; ri ; ) {
4140
+ for (ri = get_pipeline_head ( z_this ) ; ri ; ) {
4106
4141
struct request_item * ri_next = ri -> next ;
4107
4142
free (ri -> request_str );
4108
4143
free (ri );
4109
4144
ri = ri_next ;
4110
4145
}
4111
- current_request = head_request = NULL ;
4146
+ set_pipeline_head (z_this , NULL );
4147
+ set_pipeline_current (z_this , NULL );
4112
4148
4113
4149
}
4114
4150
@@ -4142,10 +4178,10 @@ PHP_METHOD(Redis, exec)
4142
4178
4143
4179
if (redis_sock_read_multibulk_multi_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock TSRMLS_CC ) < 0 ) {
4144
4180
zval_dtor (return_value );
4145
- free_reply_callbacks ();
4181
+ free_reply_callbacks (object );
4146
4182
RETURN_FALSE ;
4147
4183
}
4148
- free_reply_callbacks ();
4184
+ free_reply_callbacks (object );
4149
4185
set_flag (object , REDIS_ATOMIC );
4150
4186
}
4151
4187
@@ -4156,41 +4192,41 @@ PHP_METHOD(Redis, exec)
4156
4192
int offset = 0 ;
4157
4193
4158
4194
/* 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 ) {
4160
4196
total += ri -> request_size ;
4161
4197
}
4162
4198
if (total ) {
4163
4199
request = malloc (total );
4164
4200
}
4165
4201
4166
4202
/* 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 ) {
4168
4204
memcpy (request + offset , ri -> request_str , ri -> request_size );
4169
4205
offset += ri -> request_size ;
4170
4206
}
4171
4207
4172
4208
if (request != NULL ) {
4173
4209
if (redis_sock_write (redis_sock , request , total ) < 0 ) {
4174
4210
free (request );
4175
- free_reply_callbacks ();
4211
+ free_reply_callbacks (object );
4176
4212
set_flag (object , REDIS_ATOMIC );
4177
4213
RETURN_FALSE ;
4178
4214
}
4179
4215
free (request );
4180
4216
} else {
4181
4217
set_flag (object , REDIS_ATOMIC );
4182
- free_reply_callbacks ();
4218
+ free_reply_callbacks (object );
4183
4219
array_init (return_value ); /* empty array when no command was run. */
4184
4220
return ;
4185
4221
}
4186
4222
4187
4223
if (redis_sock_read_multibulk_pipeline_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock TSRMLS_CC ) < 0 ) {
4188
4224
set_flag (object , REDIS_ATOMIC );
4189
- free_reply_callbacks ();
4225
+ free_reply_callbacks (object );
4190
4226
RETURN_FALSE ;
4191
4227
}
4192
4228
set_flag (object , REDIS_ATOMIC );
4193
- free_reply_callbacks ();
4229
+ free_reply_callbacks (object );
4194
4230
}
4195
4231
}
4196
4232
@@ -4202,9 +4238,12 @@ PHPAPI int redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAMETE
4202
4238
RedisSock * redis_sock , zval * z_tab , int numElems TSRMLS_DC )
4203
4239
{
4204
4240
4241
+ fold_item * head = get_multi_head (getThis ());
4242
+ fold_item * current = get_multi_current (getThis ());
4205
4243
for (current = head ; current ; current = current -> next ) {
4206
4244
fold_this_item (INTERNAL_FUNCTION_PARAM_PASSTHRU , current , redis_sock , z_tab TSRMLS_CC );
4207
4245
}
4246
+ set_multi_current (getThis (), current );
4208
4247
return 0 ;
4209
4248
}
4210
4249
@@ -4229,7 +4268,7 @@ PHP_METHOD(Redis, pipeline)
4229
4268
We need the response format of the n - 1 command. So, we can delete when n > 2, the { 1 .. n - 2} commands
4230
4269
*/
4231
4270
4232
- free_reply_callbacks ();
4271
+ free_reply_callbacks (getThis () );
4233
4272
4234
4273
RETURN_ZVAL (getThis (), 1 , 0 );
4235
4274
}
0 commit comments