From 78ce2557f547b5638e0e3c4930cc035f82186427 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sat, 13 Sep 2014 01:52:47 +0800 Subject: Finally!!! Fixed segfault in GC this must not be the final fix, but let's stop the segfault first and use this to indicate where the problem is. reproduced by phpspec --- Zend/zend_gc.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'Zend/zend_gc.c') diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index adc02a3eb0..590b08a214 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -492,8 +492,11 @@ tail_call: } else if (GC_G(first_unused) != GC_G(last_unused)) { buf = GC_G(first_unused); GC_G(first_unused)++; + } else { + /* TODO: find a perfect way to handle such case */ + GC_G(gc_full) = 1; } - /* TODO: what should we do if we don't have room ??? */ + if (buf) { buf->ref = ref; buf->next = GC_G(roots).next; @@ -609,6 +612,18 @@ static int gc_collect_roots(TSRMLS_D) } current = current->next; } + + if (GC_G(gc_full) == 1) { + current = GC_G(roots).next; + while (current != &GC_G(roots)) { + GC_SET_ADDRESS(GC_INFO(current->ref), 0); + GC_SET_BLACK(GC_INFO(current->ref)); + current = current->next; + } + gc_reset(TSRMLS_CC); + return 0; + } + /* relink remaining roots into list to free */ if (GC_G(roots).next != &GC_G(roots)) { if (GC_G(to_free).next == &GC_G(to_free)) { -- cgit v1.2.1