@@ -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 ;
@@ -3276,28 +3286,24 @@ zend_object *php_memc_object_new(zend_class_entry *ce)
3276
3286
3277
3287
#ifdef HAVE_MEMCACHED_PROTOCOL
3278
3288
static
3279
- void php_memc_server_free_storage (php_memc_server_t * intern )
3289
+ void php_memc_server_free_storage (zend_object * object )
3280
3290
{
3291
+ php_memc_server_t * intern = php_memc_server_fetch_object (object );
3281
3292
zend_object_std_dtor (& intern -> zo );
3282
- efree (intern );
3283
3293
}
3284
3294
3285
- zend_object_value php_memc_server_new (zend_class_entry * ce )
3295
+ zend_object * php_memc_server_new (zend_class_entry * ce )
3286
3296
{
3287
- zend_object_value retval ;
3288
3297
php_memc_server_t * intern ;
3289
- zval * tmp ;
3290
3298
3291
- intern = ecalloc (1 , sizeof (php_memc_server_t ));
3299
+ intern = ecalloc (1 , sizeof (php_memc_server_t ) + zend_object_properties_size (ce ));
3300
+
3292
3301
zend_object_std_init (& intern -> zo , ce );
3293
3302
object_properties_init (& intern -> zo , ce );
3294
3303
3295
- intern -> handler = php_memc_proto_handler_new ();
3296
-
3297
- 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 );
3298
- retval .handlers = & memcached_server_object_handlers ;
3304
+ intern -> zo .handlers = & memcached_server_object_handlers ;
3299
3305
3300
- return retval ;
3306
+ return & intern -> zo ;
3301
3307
}
3302
3308
#endif
3303
3309
@@ -3592,8 +3598,8 @@ void s_destroy_cb (zend_fcall_info *fci)
3592
3598
{
3593
3599
if (fci -> size > 0 ) {
3594
3600
zval_ptr_dtor (& fci -> function_name );
3595
- if (fci -> object_ptr != NULL ) {
3596
- zval_ptr_dtor ( & fci -> object_ptr );
3601
+ if (fci -> object ) {
3602
+ OBJ_RELEASE ( fci -> object );
3597
3603
}
3598
3604
}
3599
3605
}
@@ -3603,19 +3609,19 @@ PHP_METHOD(MemcachedServer, run)
3603
3609
{
3604
3610
int i ;
3605
3611
zend_bool rc ;
3606
- zend * address ;
3612
+ zend_string * address ;
3607
3613
3608
3614
php_memc_server_t * intern ;
3609
- intern = Z_MEMC_OBJ_P (getThis ());
3615
+ intern = Z_MEMC_SERVER_P (getThis ());
3610
3616
3611
3617
if (zend_parse_parameters (ZEND_NUM_ARGS (), "S" , & address ) == FAILURE ) {
3612
3618
return ;
3613
3619
}
3614
3620
3615
- rc = php_memc_proto_handler_run (intern -> handler , address );
3621
+ rc = php_memc_proto_handler_run (intern -> handler , address );
3616
3622
3617
3623
for (i = MEMC_SERVER_ON_MIN + 1 ; i < MEMC_SERVER_ON_MAX ; i ++ ) {
3618
- s_destroy_cb ( & MEMC_G ( server . callbacks ) [i ].fci );
3624
+ s_destroy_cb ( & MEMC_SERVER_G ( callbacks ) [i ].fci );
3619
3625
}
3620
3626
3621
3627
RETURN_BOOL (rc );
@@ -3638,14 +3644,14 @@ PHP_METHOD(MemcachedServer, on)
3638
3644
}
3639
3645
3640
3646
if (fci .size > 0 ) {
3641
- s_destroy_cb (& MEMC_G ( server . callbacks ) [event ].fci );
3647
+ s_destroy_cb (& MEMC_SERVER_G ( callbacks ) [event ].fci );
3642
3648
3643
- MEMC_G ( server . callbacks ) [event ].fci = fci ;
3644
- MEMC_G ( server . callbacks ) [event ].fci_cache = fci_cache ;
3649
+ MEMC_SERVER_G ( callbacks ) [event ].fci = fci ;
3650
+ MEMC_SERVER_G ( callbacks ) [event ].fci_cache = fci_cache ;
3645
3651
3646
- Z_ADDREF_P (fci .function_name );
3647
- if (fci .object_ptr ) {
3648
- Z_ADDREF_P (fci .object_ptr ) ;
3652
+ Z_TRY_ADDREF (fci .function_name );
3653
+ if (fci .object ) {
3654
+ GC_REFCOUNT (fci .object ) ++ ;
3649
3655
}
3650
3656
}
3651
3657
RETURN_BOOL (rc );
@@ -4375,7 +4381,9 @@ PHP_MINIT_FUNCTION(memcached)
4375
4381
4376
4382
#ifdef HAVE_MEMCACHED_PROTOCOL
4377
4383
memcpy (& memcached_server_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
4384
+ memcached_server_object_handlers .offset = XtOffsetOf (php_memc_server_t , zo );
4378
4385
memcached_server_object_handlers .clone_obj = NULL ;
4386
+ memcached_server_object_handlers .free_obj = php_memc_server_free_storage ;
4379
4387
4380
4388
INIT_CLASS_ENTRY (ce , "MemcachedServer" , memcached_server_class_methods );
4381
4389
memcached_server_ce = zend_register_internal_class (& ce );
0 commit comments