Fix assertion violation in GC_wait_builder called from start_mark_threads
authorIvan Maidanski <ivmai@mail.ru>
Tue, 21 Jun 2016 20:38:23 +0000 (23:38 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 21 Jun 2016 20:38:23 +0000 (23:38 +0300)
(fix commit 0ca6d3f)

* include/private/gc_priv.h [PARALLEL_MARK]
(GC_start_mark_threads_inner): Declare even if no CAN_HANDLE_FORK.
* misc.c [THREADS] (GC_start_mark_threads): Define also for the case
of PARALLEL_MARK and CAN_HANDLE_FORK - call GC_start_mark_threads_inner
surrounded with DISABLE/RESTORE_CANCEL.
* pthread_support.c [PARALLEL_MARK] (GC_start_mark_threads_inner):
Always define as GC_INNER.
* win32_threads.c [GC_PTHREADS_PARAMARK] (GC_start_mark_threads_inner):
Likewise.

include/private/gc_priv.h
misc.c
pthread_support.c
win32_threads.c

index 8318ca4..439c129 100644 (file)
@@ -2401,11 +2401,7 @@ GC_INNER ptr_t GC_store_debug_info(ptr_t p, word sz, const char *str,
               /* was already done, or there was nothing to do for       */
               /* some other reason.                                     */
 
-# ifdef CAN_HANDLE_FORK
-#   define GC_start_mark_threads_inner GC_start_mark_threads
-# else
-    GC_INNER void GC_start_mark_threads_inner(void);
-# endif
+  GC_INNER void GC_start_mark_threads_inner(void);
 #endif /* PARALLEL_MARK */
 
 #if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS) && !defined(NACL) \
diff --git a/misc.c b/misc.c
index 680d69e..e68287f 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -1352,11 +1352,19 @@ GC_API void GC_CALL GC_enable_incremental(void)
   GC_init();
 }
 
-#if defined(THREADS) && (!defined(PARALLEL_MARK) || !defined(CAN_HANDLE_FORK))
+#if defined(THREADS)
   GC_API void GC_CALL GC_start_mark_threads(void)
   {
-    /* No action since parallel markers are disabled (or no POSIX fork). */
-    GC_ASSERT(I_DONT_HOLD_LOCK());
+#   if defined(PARALLEL_MARK) && defined(CAN_HANDLE_FORK)
+      IF_CANCEL(int cancel_state;)
+
+      DISABLE_CANCEL(cancel_state);
+      GC_start_mark_threads_inner();
+      RESTORE_CANCEL(cancel_state);
+#   else
+      /* No action since parallel markers are disabled (or no POSIX fork). */
+      GC_ASSERT(I_DONT_HOLD_LOCK());
+#   endif
   }
 #endif
 
index c9fb99f..fe89790 100644 (file)
@@ -385,12 +385,11 @@ STATIC pthread_t GC_mark_threads[MAX_MARKERS];
 
 #ifdef CAN_HANDLE_FORK
   static int available_markers_m1 = 0;
-  GC_API void GC_CALL
 #else
 # define available_markers_m1 GC_markers_m1
-  GC_INNER void
 #endif
-  GC_start_mark_threads_inner(void)
+
+GC_INNER void GC_start_mark_threads_inner(void)
 {
     int i;
     pthread_attr_t attr;
index e1c004c..c4f7e92 100644 (file)
@@ -1769,11 +1769,9 @@ GC_INNER void GC_get_next_stack(char *start, char *limit,
     /* for thread stack that is assumed to be large enough.             */
 #   ifdef CAN_HANDLE_FORK
       static int available_markers_m1 = 0;
-      GC_API void GC_CALL
-#   else
-      GC_INNER void
 #   endif
-      GC_start_mark_threads_inner(void)
+
+    GC_INNER void GC_start_mark_threads_inner(void)
     {
       int i;
       pthread_attr_t attr;