diff options
| author | Andi Gutmans <andi@php.net> | 2001-12-27 14:44:39 +0000 |
|---|---|---|
| committer | Andi Gutmans <andi@php.net> | 2001-12-27 14:44:39 +0000 |
| commit | 3d89072c7e6396515c4edcaa133e40708c742c95 (patch) | |
| tree | 2e88f387a725e30eca42359c575611293d61a664 /Zend/zend_objects.c | |
| parent | 73b159e0567683f96a2da78d7a2e60cf0f6f0bbc (diff) | |
| download | php-git-3d89072c7e6396515c4edcaa133e40708c742c95.tar.gz | |
- Only check refcount of object if the destructor was called.
Diffstat (limited to 'Zend/zend_objects.c')
| -rw-r--r-- | Zend/zend_objects.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 776f7d9076..1242a5a7a3 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -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 |
