summaryrefslogtreecommitdiff
path: root/Zend/zend_objects_API.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-04-09 01:50:15 +0400
committerDmitry Stogov <dmitry@zend.com>2014-04-09 01:50:15 +0400
commit7402af380b3a700dda0e89470770fde15bd56204 (patch)
tree4b8c1fdd87745f9ab0ce7f4fd32f07562d8772dc /Zend/zend_objects_API.h
parent0e7d30e8d3d3b7b637e64f6f1e2430d607d01dfc (diff)
downloadphp-git-7402af380b3a700dda0e89470770fde15bd56204.tar.gz
Fixed destruction of objects and iterators on unclean request shutdown and GC (few cases are still unfixed).
Now we destroy objects it two steps. At first - object properties of all objects and only then the objects their selves.
Diffstat (limited to 'Zend/zend_objects_API.h')
-rw-r--r--Zend/zend_objects_API.h49
1 files changed, 11 insertions, 38 deletions
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h
index f3800c855b..4d6afe6842 100644
--- a/Zend/zend_objects_API.h
+++ b/Zend/zend_objects_API.h
@@ -24,43 +24,16 @@
#include "zend.h"
-//???typedef void (*zend_objects_store_dtor_t)(zend_object *object TSRMLS_DC);
-//???typedef void (*zend_objects_free_object_storage_t)(void *object TSRMLS_DC);
-//???typedef void (*zend_objects_store_clone_t)(zend_object *object, zend_object **object_clone TSRMLS_DC);
-
-//???typedef union _zend_object_store_bucket {
-//??? zend_object *object;
-//??? int next_free;
-//??? zend_bool destructor_called;
-//??? zend_bool valid;
-//??? zend_uchar apply_count;
-//??? union _store_bucket {
-//??? struct _store_object {
-//??? zend_object *object;
-//??? zend_objects_store_dtor_t dtor;
-//??? zend_objects_free_object_storage_t free_storage;
-//??? zend_objects_store_clone_t clone;
-//??? const zend_object_handlers *handlers;
-//??? zend_uint refcount;
-//??? gc_root_buffer *buffered;
-//??? } obj;
-//??? zend_object *obj;
-//??? struct {
-//??? int next;
-//??? } free_list;
-//??? } bucket;
-//???} zend_object_store_bucket;
-
-#define FREE_BUCKET 1
-
-#define IS_VALID(o) (!(((zend_uintptr_t)(o)) & FREE_BUCKET))
-
-#define SET_INVALID(o) ((zend_object*)((((zend_uintptr_t)(o)) | FREE_BUCKET)))
-
-#define GET_BUCKET_NUMBER(o) (((zend_intptr_t)(o)) >> 1)
-
-#define SET_BUCKET_NUMBER(o, n) do { \
- (o) = (zend_object*)((((zend_uintptr_t)(n)) << 1) | FREE_BUCKET); \
+#define OBJ_BUCKET_INVALID (1<<0)
+
+#define IS_OBJ_VALID(o) (!(((zend_uintptr_t)(o)) & OBJ_BUCKET_INVALID))
+
+#define SET_OBJ_INVALID(o) ((zend_object*)((((zend_uintptr_t)(o)) | OBJ_BUCKET_INVALID)))
+
+#define GET_OBJ_BUCKET_NUMBER(o) (((zend_intptr_t)(o)) >> 1)
+
+#define SET_OBJ_BUCKET_NUMBER(o, n) do { \
+ (o) = (zend_object*)((((zend_uintptr_t)(n)) << 1) | OBJ_BUCKET_INVALID); \
} while (0)
@@ -98,7 +71,7 @@ ZEND_API void zend_object_store_ctor_failed(zend_object *object TSRMLS_DC);
ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects TSRMLS_DC);
-#define ZEND_OBJECTS_STORE_HANDLERS zend_object_free, zend_object_std_dtor, zend_objects_clone_obj
+#define ZEND_OBJECTS_STORE_HANDLERS 0, zend_object_std_dtor, zend_objects_destroy_object, zend_objects_clone_obj
ZEND_API zend_object *zend_object_create_proxy(zval *object, zval *member TSRMLS_DC);