@@ -217,10 +217,20 @@ static inline php_memc_object_t *php_memc_fetch_object(zend_object *obj) {
217
217
#ifdef HAVE_MEMCACHED_PROTOCOL
218
218
219
219
typedef struct {
220
- zend_object zo ;
221
220
php_memc_proto_handler_t * handler ;
221
+ zend_object zo ;
222
222
} php_memc_server_t ;
223
223
224
+ static inline php_memc_server_t * php_memc_server_fetch_object (zend_object * obj ) {
225
+ return (php_memc_server_t * )((char * )obj - XtOffsetOf (php_memc_server_t , zo ));
226
+ }
227
+ #define Z_MEMC_SERVER_P (zv ) php_memc_server_fetch_object(Z_OBJ_P(zv))
228
+
229
+ #ifdef ZTS
230
+ #define MEMC_SERVER_G (v ) TSRMG(php_memcached_globals_id, zend_php_memcached_globals *, server.v)
231
+ #else
232
+ #define MEMC_SERVER_G (v ) (php_memcached_globals.server.v)
233
+ #endif
224
234
#endif
225
235
226
236
static zend_class_entry * memcached_ce = NULL ;
@@ -3271,28 +3281,24 @@ zend_object *php_memc_object_new(zend_class_entry *ce)
3271
3281
3272
3282
#ifdef HAVE_MEMCACHED_PROTOCOL
3273
3283
static
3274
- void php_memc_server_free_storage (php_memc_server_t * intern )
3284
+ void php_memc_server_free_storage (zend_object * object )
3275
3285
{
3286
+ php_memc_server_t * intern = php_memc_server_fetch_object (object );
3276
3287
zend_object_std_dtor (& intern -> zo );
3277
- efree (intern );
3278
3288
}
3279
3289
3280
- zend_object_value php_memc_server_new (zend_class_entry * ce )
3290
+ zend_object * php_memc_server_new (zend_class_entry * ce )
3281
3291
{
3282
- zend_object_value retval ;
3283
3292
php_memc_server_t * intern ;
3284
- zval * tmp ;
3285
3293
3286
- intern = ecalloc (1 , sizeof (php_memc_server_t ));
3294
+ intern = ecalloc (1 , sizeof (php_memc_server_t ) + zend_object_properties_size (ce ));
3295
+
3287
3296
zend_object_std_init (& intern -> zo , ce );
3288
3297
object_properties_init (& intern -> zo , ce );
3289
3298
3290
- intern -> handler = php_memc_proto_handler_new ();
3291
-
3292
- retval .handle = zend_objects_store_put (intern , (zend_objects_store_dtor_t )zend_objects_destroy_object , (zend_objects_free_object_storage_t )php_memc_server_free_storage , NULL );
3293
- retval .handlers = & memcached_server_object_handlers ;
3299
+ intern -> zo .handlers = & memcached_server_object_handlers ;
3294
3300
3295
- return retval ;
3301
+ return & intern -> zo ;
3296
3302
}
3297
3303
#endif
3298
3304
@@ -3587,8 +3593,8 @@ void s_destroy_cb (zend_fcall_info *fci)
3587
3593
{
3588
3594
if (fci -> size > 0 ) {
3589
3595
zval_ptr_dtor (& fci -> function_name );
3590
- if (fci -> object_ptr != NULL ) {
3591
- zval_ptr_dtor ( & fci -> object_ptr );
3596
+ if (fci -> object ) {
3597
+ OBJ_RELEASE ( fci -> object );
3592
3598
}
3593
3599
}
3594
3600
}
@@ -3598,19 +3604,19 @@ PHP_METHOD(MemcachedServer, run)
3598
3604
{
3599
3605
int i ;
3600
3606
zend_bool rc ;
3601
- zend * address ;
3607
+ zend_string * address ;
3602
3608
3603
3609
php_memc_server_t * intern ;
3604
- intern = Z_MEMC_OBJ_P (getThis ());
3610
+ intern = Z_MEMC_SERVER_P (getThis ());
3605
3611
3606
3612
if (zend_parse_parameters (ZEND_NUM_ARGS (), "S" , & address ) == FAILURE ) {
3607
3613
return ;
3608
3614
}
3609
3615
3610
- rc = php_memc_proto_handler_run (intern -> handler , address );
3616
+ rc = php_memc_proto_handler_run (intern -> handler , address );
3611
3617
3612
3618
for (i = MEMC_SERVER_ON_MIN + 1 ; i < MEMC_SERVER_ON_MAX ; i ++ ) {
3613
- s_destroy_cb ( & MEMC_G ( server . callbacks ) [i ].fci );
3619
+ s_destroy_cb ( & MEMC_SERVER_G ( callbacks ) [i ].fci );
3614
3620
}
3615
3621
3616
3622
RETURN_BOOL (rc );
@@ -3633,14 +3639,14 @@ PHP_METHOD(MemcachedServer, on)
3633
3639
}
3634
3640
3635
3641
if (fci .size > 0 ) {
3636
- s_destroy_cb (& MEMC_G ( server . callbacks ) [event ].fci );
3642
+ s_destroy_cb (& MEMC_SERVER_G ( callbacks ) [event ].fci );
3637
3643
3638
- MEMC_G ( server . callbacks ) [event ].fci = fci ;
3639
- MEMC_G ( server . callbacks ) [event ].fci_cache = fci_cache ;
3644
+ MEMC_SERVER_G ( callbacks ) [event ].fci = fci ;
3645
+ MEMC_SERVER_G ( callbacks ) [event ].fci_cache = fci_cache ;
3640
3646
3641
- Z_ADDREF_P (fci .function_name );
3642
- if (fci .object_ptr ) {
3643
- Z_ADDREF_P (fci .object_ptr ) ;
3647
+ Z_TRY_ADDREF (fci .function_name );
3648
+ if (fci .object ) {
3649
+ GC_REFCOUNT (fci .object ) ++ ;
3644
3650
}
3645
3651
}
3646
3652
RETURN_BOOL (rc );
@@ -4370,7 +4376,9 @@ PHP_MINIT_FUNCTION(memcached)
4370
4376
4371
4377
#ifdef HAVE_MEMCACHED_PROTOCOL
4372
4378
memcpy (& memcached_server_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
4379
+ memcached_server_object_handlers .offset = XtOffsetOf (php_memc_server_t , zo );
4373
4380
memcached_server_object_handlers .clone_obj = NULL ;
4381
+ memcached_server_object_handlers .free_obj = php_memc_server_free_storage ;
4374
4382
4375
4383
INIT_CLASS_ENTRY (ce , "MemcachedServer" , memcached_server_class_methods );
4376
4384
memcached_server_ce = zend_register_internal_class (& ce );
0 commit comments