summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2001-12-27 14:44:39 +0000
committerAndi Gutmans <andi@php.net>2001-12-27 14:44:39 +0000
commit3d89072c7e6396515c4edcaa133e40708c742c95 (patch)
tree2e88f387a725e30eca42359c575611293d61a664 /Zend/zend_objects.c
parent73b159e0567683f96a2da78d7a2e60cf0f6f0bbc (diff)
downloadphp-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.c32
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