]> granicus.if.org Git - php/commitdiff
Add:
authorAndrei Zmievski <andrei@php.net>
Fri, 21 Apr 2006 16:36:38 +0000 (16:36 +0000)
committerAndrei Zmievski <andrei@php.net>
Fri, 21 Apr 2006 16:36:38 +0000 (16:36 +0000)
 * zend_objects_store_add_ref_by_handle()
 * zend_objects_store_del_ref_by_handle()
 * zend_objects_store_get_object_by_handle()

Zend/zend_objects_API.c
Zend/zend_objects_API.h

index e795d1fa1f65bb2c1ca3a3e6ec9e1d30af9c6ad0..0a35ad8fd3247ef966d6180eb948dae76b4c49c9 100644 (file)
@@ -135,6 +135,11 @@ ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC)
 #endif
 }
 
+ZEND_API void zend_objects_store_add_ref_by_handle(zend_object_handle handle TSRMLS_DC)
+{
+       EG(objects_store).object_buckets[handle].bucket.obj.refcount++;
+}
+
 #define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST()                                                                                                                                  \
                        EG(objects_store).object_buckets[handle].bucket.free_list.next = EG(objects_store).free_list_head;      \
                        EG(objects_store).free_list_head = handle;                                                                                                                      \
@@ -143,28 +148,35 @@ ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC)
 ZEND_API void zend_objects_store_del_ref(zval *zobject TSRMLS_DC)
 {
        zend_object_handle handle;
+
+       handle = Z_OBJ_HANDLE_P(zobject);
+
+       zobject->refcount++;
+       zend_objects_store_del_ref_by_handle(handle TSRMLS_CC);
+       zobject->refcount--;
+}
+
+ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC)
+{
        struct _store_object *obj;
 
        if (!EG(objects_store).object_buckets) {
                return;
        }
 
-       handle = Z_OBJ_HANDLE_P(zobject);
        obj = &EG(objects_store).object_buckets[handle].bucket.obj;
 
        /*      Make sure we hold a reference count during the destructor call
                otherwise, when the destructor ends the storage might be freed
                when the refcount reaches 0 a second time
-       */
+        */
        if (EG(objects_store).object_buckets[handle].valid) {
                if (obj->refcount == 1) {
                        if (!EG(objects_store).object_buckets[handle].destructor_called) {
                                EG(objects_store).object_buckets[handle].destructor_called = 1;
 
                                if (obj->dtor) {
-                                       zobject->refcount++;
                                        obj->dtor(obj->object, handle TSRMLS_CC);
-                                       zobject->refcount--;
                                }
                        }
                        if (obj->refcount == 1) {
@@ -215,6 +227,11 @@ ZEND_API void *zend_object_store_get_object(zval *zobject TSRMLS_DC)
        return EG(objects_store).object_buckets[handle].bucket.obj.object;
 }
 
+ZEND_API void *zend_object_store_get_object_by_handle(zend_object_handle handle TSRMLS_DC)
+{
+       return EG(objects_store).object_buckets[handle].bucket.obj.object;
+}
+
 /* zend_object_store_set_object:
  * It is ONLY valid to call this function from within the constructor of an
  * overloaded object.  Its purpose is to set the object pointer for the object
index e3e2412b520abfd7475084717751d55b187bcc97..f465f2c46a53475b73e86e7386531b9a1bfcfd81 100644 (file)
@@ -64,8 +64,11 @@ ZEND_API zend_object_handle zend_objects_store_put(void *object, zend_objects_st
 
 ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC);
 ZEND_API void zend_objects_store_del_ref(zval *object TSRMLS_DC);
+ZEND_API void zend_objects_store_add_ref_by_handle(zend_object_handle handle TSRMLS_DC);
+ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC);
 ZEND_API zend_object_value zend_objects_store_clone_obj(zval *object TSRMLS_DC);
 ZEND_API void *zend_object_store_get_object(zval *object TSRMLS_DC);
+ZEND_API void *zend_object_store_get_object_by_handle(zend_object_handle handle TSRMLS_DC);
 /* See comment in zend_objects_API.c before you use this */
 ZEND_API void zend_object_store_set_object(zval *zobject, void *object TSRMLS_DC);
 ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC);