]> granicus.if.org Git - gc/commitdiff
Fix push_complex_descriptor to avoid unlimited global mark stack growth
authorIvan Maidanski <ivmai@mail.ru>
Tue, 11 Jul 2017 23:04:30 +0000 (02:04 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 8 Aug 2017 07:43:21 +0000 (10:43 +0300)
Global mark stack should not grow in parallel marker mode (as
fixed-size local_mark_stack is used instead).

* typd_mlc.c [PARALLEL_MARK] (GC_array_mark_proc): Do not set
GC_mark_stack_too_small if GC_parallel (and new_mark_stack_ptr is
null); add comment.

typd_mlc.c

index 12bdd8acebcb4832bc6b4e8166ca4ac2270e0e48..2e1da820ee4286b17160401c17057c2a7e671fc2 100644 (file)
@@ -520,7 +520,13 @@ STATIC mse * GC_array_mark_proc(word * addr, mse * mark_stack_ptr,
         /* and request a mark stack expansion.                          */
         /* This cannot cause a mark stack overflow, since it replaces   */
         /* the original array entry.                                    */
-        GC_mark_stack_too_small = TRUE;
+#       ifdef PARALLEL_MARK
+            /* We are using a local_mark_stack in parallel mode.        */
+            if (!GC_parallel)
+#       endif
+        {
+            GC_mark_stack_too_small = TRUE;
+        }
         new_mark_stack_ptr = orig_mark_stack_ptr + 1;
         new_mark_stack_ptr -> mse_start = (ptr_t)addr;
         new_mark_stack_ptr -> mse_descr.w = sz | GC_DS_LENGTH;