]> granicus.if.org Git - gc/commitdiff
Fix 'unexpected mark stack overflow' abort in push_all_stack
authorIvan Maidanski <ivmai@mail.ru>
Mon, 21 Jan 2019 22:01:45 +0000 (01:01 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 28 Jan 2019 07:00:48 +0000 (10:00 +0300)
Issue #260 (bdwgc).

* mark.c [!NEED_FIXUP_POINTER] (GC_push_all_stack): Call
GC_push_all_eager() instead of GC_push_all() if GC_mark_stack_top is
rather close to GC_mark_stack_limit.

mark.c

diff --git a/mark.c b/mark.c
index 72223bb61f6b85ff1b38a6358320b2c0207d6040..ade6f533c39052ee6a239ce4cf0ed382f44e0c87 100644 (file)
--- a/mark.c
+++ b/mark.c
@@ -1605,7 +1605,8 @@ GC_INNER void GC_push_all_stack(ptr_t bottom, ptr_t top)
 #         if defined(THREADS) && defined(MPROTECT_VDB)
             && !GC_auto_incremental
 #         endif
-         ) {
+          && (word)GC_mark_stack_top
+             < (word)(GC_mark_stack_limit - INITIAL_MARK_STACK_SIZE/8)) {
         GC_push_all(bottom, top);
       } else
 #   endif