everted (this part was committed by mistake)

This commit is contained in:
Dmitry Stogov 2008-02-19 17:05:41 +00:00
parent f4dc0f293d
commit caee59b856

View file

@ -158,7 +158,8 @@ ZEND_API void zend_objects_store_add_ref_by_handle(zend_object_handle handle TSR
#define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST() \ #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).object_buckets[handle].bucket.free_list.next = EG(objects_store).free_list_head; \
EG(objects_store).free_list_head = handle; EG(objects_store).free_list_head = handle; \
EG(objects_store).object_buckets[handle].valid = 0;
ZEND_API void zend_objects_store_del_ref(zval *zobject TSRMLS_DC) ZEND_API void zend_objects_store_del_ref(zval *zobject TSRMLS_DC)
{ {
@ -185,12 +186,13 @@ ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSR
return; return;
} }
obj = &EG(objects_store).object_buckets[handle].bucket.obj;
/* Make sure we hold a reference count during the destructor call /* Make sure we hold a reference count during the destructor call
otherwise, when the destructor ends the storage might be freed otherwise, when the destructor ends the storage might be freed
when the refcount reaches 0 a second time when the refcount reaches 0 a second time
*/ */
if (EG(objects_store).object_buckets[handle].valid) { if (EG(objects_store).object_buckets[handle].valid) {
obj = &EG(objects_store).object_buckets[handle].bucket.obj;
if (obj->refcount == 1) { if (obj->refcount == 1) {
if (!EG(objects_store).object_buckets[handle].destructor_called) { if (!EG(objects_store).object_buckets[handle].destructor_called) {
EG(objects_store).object_buckets[handle].destructor_called = 1; EG(objects_store).object_buckets[handle].destructor_called = 1;
@ -204,7 +206,6 @@ ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSR
} }
} }
if (obj->refcount == 1) { if (obj->refcount == 1) {
EG(objects_store).object_buckets[handle].valid = 0;
GC_REMOVE_ZOBJ_FROM_BUFFER(obj); GC_REMOVE_ZOBJ_FROM_BUFFER(obj);
if (obj->free_storage) { if (obj->free_storage) {
zend_try { zend_try {
@ -216,20 +217,19 @@ ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSR
ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(); ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST();
} }
} }
}
obj->refcount--; obj->refcount--;
#if ZEND_DEBUG_OBJECTS #if ZEND_DEBUG_OBJECTS
if (obj->refcount == 0) { if (obj->refcount == 0) {
fprintf(stderr, "Deallocated object id #%d\n", handle); fprintf(stderr, "Deallocated object id #%d\n", handle);
} else { } else {
fprintf(stderr, "Decreased refcount of object id #%d\n", handle); fprintf(stderr, "Decreased refcount of object id #%d\n", handle);
} }
#endif #endif
if (failure) {
if (failure) { zend_bailout();
zend_bailout();
}
} }
} }