]> 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, 11 Jul 2017 23:04:30 +0000 (02:04 +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 ecee04f9ad174f4027f0bb44c90b2e14c2353526..5e36d7f59690765f7db119167e5e2a31f0a26dc4 100644 (file)
@@ -503,7 +503,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;