]> granicus.if.org Git - php/commitdiff
- Only check refcount of object if the destructor was called.
authorAndi Gutmans <andi@php.net>
Thu, 27 Dec 2001 14:44:39 +0000 (14:44 +0000)
committerAndi Gutmans <andi@php.net>
Thu, 27 Dec 2001 14:44:39 +0000 (14:44 +0000)
Zend/zend_objects.c

index 776f7d9076dff6ec6137fb83ffe4a01332667367..1242a5a7a3e6513e6b1a76a8c3fa3e973c4eb2ac 100644 (file)
@@ -145,26 +145,32 @@ void zend_objects_delete_obj(zend_object_handle handle)
 
 }
 
+#define ZEND_OBJECTS_ADD_TO_FREE_LIST()                                                                                                                                \
+                       EG(objects).object_buckets[handle].bucket.free_list.next = EG(objects).free_list_head;  \
+                       EG(objects).free_list_head = handle;                                                                                                    \
+                       EG(objects).object_buckets[handle].valid = 0;
+
 void zend_objects_del_ref(zend_object_handle handle)
 {
        TSRMLS_FETCH();
 
        if (--EG(objects).object_buckets[handle].bucket.obj.refcount == 0) {
                zend_object *object;
-
-               if (EG(objects).object_buckets[handle].valid) {
-                       if (!EG(objects).object_buckets[handle].constructor_called) {
-                               object = &EG(objects).object_buckets[handle].bucket.obj.object;
-                               EG(objects).object_buckets[handle].constructor_called = 1;
-                               zend_objects_destroy_object(object, handle TSRMLS_CC);
+               do {
+                       if (EG(objects).object_buckets[handle].valid) {
+                               if (!EG(objects).object_buckets[handle].constructor_called) {
+                                       object = &EG(objects).object_buckets[handle].bucket.obj.object;
+                                       EG(objects).object_buckets[handle].constructor_called = 1;
+                                       zend_objects_destroy_object(object, handle TSRMLS_CC);
+                                       if (EG(objects).object_buckets[handle].bucket.obj.refcount == 0) {
+                                               ZEND_OBJECTS_ADD_TO_FREE_LIST();
+                                       }
+                                       break;
+                               }                       
                        }
-               }
-               /* FIXME: Optimizer this so that only if the constructor was called we recheck the refcount */
-               if (EG(objects).object_buckets[handle].bucket.obj.refcount == 0) {
-                       EG(objects).object_buckets[handle].bucket.free_list.next = EG(objects).free_list_head;
-                       EG(objects).free_list_head = handle;
-                       EG(objects).object_buckets[handle].valid = 0;
-               }
+                       ZEND_OBJECTS_ADD_TO_FREE_LIST();
+               } while (0);
+               
 #if ZEND_DEBUG_OBJECTS
                fprintf(stderr, "Deallocated object id #%d\n", handle);
 #endif