@@ -217,10 +217,20 @@ static inline php_memc_object_t *php_memc_fetch_object(zend_object *obj) {
217217#ifdef HAVE_MEMCACHED_PROTOCOL
218218
219219typedef struct {
220- zend_object zo ;
221220 php_memc_proto_handler_t * handler ;
221+ zend_object zo ;
222222} php_memc_server_t ;
223223
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
224234#endif
225235
226236static zend_class_entry * memcached_ce = NULL ;
@@ -3271,28 +3281,24 @@ zend_object *php_memc_object_new(zend_class_entry *ce)
32713281
32723282#ifdef HAVE_MEMCACHED_PROTOCOL
32733283static
3274- void php_memc_server_free_storage (php_memc_server_t * intern )
3284+ void php_memc_server_free_storage (zend_object * object )
32753285{
3286+ php_memc_server_t * intern = php_memc_server_fetch_object (object );
32763287 zend_object_std_dtor (& intern -> zo );
3277- efree (intern );
32783288}
32793289
3280- zend_object_value php_memc_server_new (zend_class_entry * ce )
3290+ zend_object * php_memc_server_new (zend_class_entry * ce )
32813291{
3282- zend_object_value retval ;
32833292 php_memc_server_t * intern ;
3284- zval * tmp ;
32853293
3286- intern = ecalloc (1 , sizeof (php_memc_server_t ));
3294+ intern = ecalloc (1 , sizeof (php_memc_server_t ) + zend_object_properties_size (ce ));
3295+
32873296 zend_object_std_init (& intern -> zo , ce );
32883297 object_properties_init (& intern -> zo , ce );
32893298
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 ;
32943300
3295- return retval ;
3301+ return & intern -> zo ;
32963302}
32973303#endif
32983304
@@ -3587,8 +3593,8 @@ void s_destroy_cb (zend_fcall_info *fci)
35873593{
35883594 if (fci -> size > 0 ) {
35893595 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 );
35923598 }
35933599 }
35943600}
@@ -3598,19 +3604,19 @@ PHP_METHOD(MemcachedServer, run)
35983604{
35993605 int i ;
36003606 zend_bool rc ;
3601- zend * address ;
3607+ zend_string * address ;
36023608
36033609 php_memc_server_t * intern ;
3604- intern = Z_MEMC_OBJ_P (getThis ());
3610+ intern = Z_MEMC_SERVER_P (getThis ());
36053611
36063612 if (zend_parse_parameters (ZEND_NUM_ARGS (), "S" , & address ) == FAILURE ) {
36073613 return ;
36083614 }
36093615
3610- rc = php_memc_proto_handler_run (intern -> handler , address );
3616+ rc = php_memc_proto_handler_run (intern -> handler , address );
36113617
36123618 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 );
36143620 }
36153621
36163622 RETURN_BOOL (rc );
@@ -3633,14 +3639,14 @@ PHP_METHOD(MemcachedServer, on)
36333639 }
36343640
36353641 if (fci .size > 0 ) {
3636- s_destroy_cb (& MEMC_G ( server . callbacks ) [event ].fci );
3642+ s_destroy_cb (& MEMC_SERVER_G ( callbacks ) [event ].fci );
36373643
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 ;
36403646
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 ) ++ ;
36443650 }
36453651 }
36463652 RETURN_BOOL (rc );
@@ -4370,7 +4376,9 @@ PHP_MINIT_FUNCTION(memcached)
43704376
43714377#ifdef HAVE_MEMCACHED_PROTOCOL
43724378 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 );
43734380 memcached_server_object_handlers .clone_obj = NULL ;
4381+ memcached_server_object_handlers .free_obj = php_memc_server_free_storage ;
43744382
43754383 INIT_CLASS_ENTRY (ce , "MemcachedServer" , memcached_server_class_methods );
43764384 memcached_server_ce = zend_register_internal_class (& ce );
0 commit comments