@@ -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 ;
@@ -3276,28 +3286,24 @@ zend_object *php_memc_object_new(zend_class_entry *ce)
32763286
32773287#ifdef HAVE_MEMCACHED_PROTOCOL
32783288static
3279- void php_memc_server_free_storage (php_memc_server_t * intern )
3289+ void php_memc_server_free_storage (zend_object * object )
32803290{
3291+ php_memc_server_t * intern = php_memc_server_fetch_object (object );
32813292 zend_object_std_dtor (& intern -> zo );
3282- efree (intern );
32833293}
32843294
3285- zend_object_value php_memc_server_new (zend_class_entry * ce )
3295+ zend_object * php_memc_server_new (zend_class_entry * ce )
32863296{
3287- zend_object_value retval ;
32883297 php_memc_server_t * intern ;
3289- zval * tmp ;
32903298
3291- intern = ecalloc (1 , sizeof (php_memc_server_t ));
3299+ intern = ecalloc (1 , sizeof (php_memc_server_t ) + zend_object_properties_size (ce ));
3300+
32923301 zend_object_std_init (& intern -> zo , ce );
32933302 object_properties_init (& intern -> zo , ce );
32943303
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 ;
32993305
3300- return retval ;
3306+ return & intern -> zo ;
33013307}
33023308#endif
33033309
@@ -3592,8 +3598,8 @@ void s_destroy_cb (zend_fcall_info *fci)
35923598{
35933599 if (fci -> size > 0 ) {
35943600 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 );
35973603 }
35983604 }
35993605}
@@ -3603,19 +3609,19 @@ PHP_METHOD(MemcachedServer, run)
36033609{
36043610 int i ;
36053611 zend_bool rc ;
3606- zend * address ;
3612+ zend_string * address ;
36073613
36083614 php_memc_server_t * intern ;
3609- intern = Z_MEMC_OBJ_P (getThis ());
3615+ intern = Z_MEMC_SERVER_P (getThis ());
36103616
36113617 if (zend_parse_parameters (ZEND_NUM_ARGS (), "S" , & address ) == FAILURE ) {
36123618 return ;
36133619 }
36143620
3615- rc = php_memc_proto_handler_run (intern -> handler , address );
3621+ rc = php_memc_proto_handler_run (intern -> handler , address );
36163622
36173623 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 );
36193625 }
36203626
36213627 RETURN_BOOL (rc );
@@ -3638,14 +3644,14 @@ PHP_METHOD(MemcachedServer, on)
36383644 }
36393645
36403646 if (fci .size > 0 ) {
3641- s_destroy_cb (& MEMC_G ( server . callbacks ) [event ].fci );
3647+ s_destroy_cb (& MEMC_SERVER_G ( callbacks ) [event ].fci );
36423648
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 ;
36453651
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 ) ++ ;
36493655 }
36503656 }
36513657 RETURN_BOOL (rc );
@@ -4375,7 +4381,9 @@ PHP_MINIT_FUNCTION(memcached)
43754381
43764382#ifdef HAVE_MEMCACHED_PROTOCOL
43774383 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 );
43784385 memcached_server_object_handlers .clone_obj = NULL ;
4386+ memcached_server_object_handlers .free_obj = php_memc_server_free_storage ;
43794387
43804388 INIT_CLASS_ENTRY (ce , "MemcachedServer" , memcached_server_class_methods );
43814389 memcached_server_ce = zend_register_internal_class (& ce );
0 commit comments