summaryrefslogtreecommitdiff
path: root/Zend/zend_gc.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-03-01 15:51:50 +0300
committerDmitry Stogov <dmitry@zend.com>2018-03-01 15:51:50 +0300
commit165dadace333a454d189f066400a753190198d2e (patch)
treee0c60870d13463a224c924c8f90e407d66c9610f /Zend/zend_gc.c
parent5994b8ac954617a946096702c2377a8b53b6053a (diff)
downloadphp-git-165dadace333a454d189f066400a753190198d2e.tar.gz
Cleanup
Diffstat (limited to 'Zend/zend_gc.c')
-rw-r--r--Zend/zend_gc.c69
1 files changed, 32 insertions, 37 deletions
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index b6d4aba255..f3bb2a54b6 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -80,45 +80,48 @@
# define ZEND_GC_DEBUG 0
#endif
-/* GC_TYPE */
-#define GC_COLOR 0x300000
+/* GC_INFO layout */
+#define GC_ADDRESS 0x0fffff
+#define GC_COLOR 0x300000
-#define GC_BLACK 0x000000 /* must be zero */
-#define GC_WHITE 0x100000
-#define GC_GREY 0x200000
-#define GC_PURPLE 0x300000
+#define GC_BLACK 0x000000 /* must be zero */
+#define GC_WHITE 0x100000
+#define GC_GREY 0x200000
+#define GC_PURPLE 0x300000
-#define GC_ADDRESS(v) \
- ((v) & ~GC_COLOR)
+/* GC_INFO access */
+#define GC_REF_ADDRESS(ref) \
+ (((GC_TYPE_INFO(ref)) & (GC_ADDRESS << GC_INFO_SHIFT)) >> GC_INFO_SHIFT)
-#define GC_INFO_GET_COLOR(v) \
- (((zend_uintptr_t)(v)) & GC_COLOR)
-
-/* GC_TYPE_INFO */
-#define GC_REF_SET_INFO(ref, info) \
- gc_ref_set_info(ref, info)
-#define GC_REF_SET_INFO_EX(ref, buffer, color) \
- gc_ref_set_info_ex(ref, buffer, color)
-
-#define GC_REF_GET_COLOR(ref) \
- GC_INFO_GET_COLOR(GC_INFO(ref))
+#define GC_REF_COLOR(ref) \
+ (((GC_TYPE_INFO(ref)) & (GC_COLOR << GC_INFO_SHIFT)) >> GC_INFO_SHIFT)
#define GC_REF_CHECK_COLOR(ref, color) \
((GC_TYPE_INFO(ref) & (GC_COLOR << GC_INFO_SHIFT)) == ((color) << GC_INFO_SHIFT))
+#define GC_REF_SET_INFO(ref, info) do { \
+ GC_TYPE_INFO(ref) = \
+ (GC_TYPE_INFO(ref) & (GC_TYPE_MASK | GC_FLAGS_MASK)) | \
+ ((info) << GC_INFO_SHIFT); \
+ } while (0)
+
+#define GC_REF_SET_INFO_EX(ref, buffer, color) \
+ gc_ref_set_info_ex(ref, buffer, color)
+
#define GC_REF_SET_COLOR(ref, c) do { \
GC_TYPE_INFO(ref) = \
(GC_TYPE_INFO(ref) & ~(GC_COLOR << GC_INFO_SHIFT)) | \
((c) << GC_INFO_SHIFT); \
} while (0)
+
#define GC_REF_SET_BLACK(ref) do { \
GC_TYPE_INFO(ref) &= ~(GC_COLOR << GC_INFO_SHIFT); \
} while (0)
+
#define GC_REF_SET_PURPLE(ref) do { \
GC_TYPE_INFO(ref) |= (GC_COLOR << GC_INFO_SHIFT); \
} while (0)
-
/* GC buffer size */
#define GC_INVALID 0
#define GC_FIRST_REAL_ROOT 1
@@ -317,14 +320,6 @@ static zend_always_inline void gc_ref_set_info_ex(zend_refcounted *ref, gc_root_
GC_TYPE_INFO(ref) =
(((char*)buffer + ((color) << 3) - (char*)GC_G(buf)) << (GC_INFO_SHIFT - 3))
| (GC_TYPE_INFO(ref) & (GC_TYPE_MASK | GC_FLAGS_MASK));
- } else if (sizeof(gc_root_buffer) == 16) {
- GC_TYPE_INFO(ref) =
- (((char*)buffer + ((color) << 4) - (char*)GC_G(buf)) << (GC_INFO_SHIFT - 4))
- | (GC_TYPE_INFO(ref) & (GC_TYPE_MASK | GC_FLAGS_MASK));
- } else if (sizeof(gc_root_buffer) == 32) {
- GC_TYPE_INFO(ref) =
- (((char*)buffer + ((color) << 5) - (char*)GC_G(buf)) << (GC_INFO_SHIFT - 5))
- | (GC_TYPE_INFO(ref) & (GC_TYPE_MASK | GC_FLAGS_MASK));
} else {
GC_TYPE_INFO(ref) = ((buffer - GC_G(buf)) << GC_INFO_SHIFT)
| (color << GC_INFO_SHIFT)
@@ -346,19 +341,19 @@ static void gc_trace_ref(zend_refcounted *ref) {
if (GC_TYPE(ref) == IS_OBJECT) {
zend_object *obj = (zend_object *) ref;
fprintf(stderr, "[%p] rc=%d addr=%d %s object(%s)#%d ",
- ref, GC_REFCOUNT(ref), GC_ADDRESS(GC_INFO(ref)),
- gc_color_name(GC_REF_GET_COLOR(ref)),
+ ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref),
+ gc_color_name(GC_REF_COLOR(ref)),
obj->ce->name->val, obj->handle);
} else if (GC_TYPE(ref) == IS_ARRAY) {
zend_array *arr = (zend_array *) ref;
fprintf(stderr, "[%p] rc=%d addr=%d %s array(%d) ",
- ref, GC_REFCOUNT(ref), GC_ADDRESS(GC_INFO(ref)),
- gc_color_name(GC_REF_GET_COLOR(ref)),
+ ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref),
+ gc_color_name(GC_REF_COLOR(ref)),
zend_hash_num_elements(arr));
} else {
fprintf(stderr, "[%p] rc=%d addr=%d %s %s ",
- ref, GC_REFCOUNT(ref), GC_ADDRESS(GC_INFO(ref)),
- gc_color_name(GC_REF_GET_COLOR(ref)),
+ ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref),
+ gc_color_name(GC_REF_COLOR(ref)),
zend_get_type_by_const(GC_TYPE(ref)));
}
}
@@ -594,7 +589,7 @@ ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref)
ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref)
{
gc_root_buffer *root;
- uint32_t addr = GC_ADDRESS(GC_INFO(ref));
+ uint32_t addr = GC_REF_ADDRESS(ref);
ZEND_ASSERT(addr);
@@ -848,7 +843,7 @@ static void gc_compact(void)
if (UNEXPECTED(GC_NEED_COMPRESSION(addr))) {
addr = gc_compress(addr);
}
- GC_REF_SET_INFO(p, addr | GC_REF_GET_COLOR(p));
+ GC_REF_SET_INFO(p, addr | GC_REF_COLOR(p));
free++;
scan--;
if (scan <= GC_G(num_roots)) {
@@ -1188,7 +1183,7 @@ static void gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buff
tail_call:
if (root ||
- (GC_ADDRESS(GC_INFO(ref)) != 0 &&
+ (GC_REF_ADDRESS(ref) != 0 &&
GC_REF_CHECK_COLOR(ref, GC_BLACK))) {
GC_TRACE_REF(ref, "removing from buffer");
if (root) {