diff options
-rw-r--r-- | pthread_support.c | 3 | ||||
-rw-r--r-- | win32_threads.c | 3 |
2 files changed, 6 insertions, 0 deletions
diff --git a/pthread_support.c b/pthread_support.c index fefb1ed6..7e6a13a3 100644 --- a/pthread_support.c +++ b/pthread_support.c @@ -383,6 +383,7 @@ STATIC pthread_t GC_mark_threads[MAX_MARKERS]; static int available_markers_m1 = 0; static pthread_cond_t mark_cv; /* initialized by GC_start_mark_threads_inner */ + STATIC void GC_wait_for_gc_completion(GC_bool wait_for_all); #else # define available_markers_m1 GC_markers_m1 static pthread_cond_t mark_cv = PTHREAD_COND_INITIALIZER; @@ -397,10 +398,12 @@ GC_INNER void GC_start_mark_threads_inner(void) # endif GC_ASSERT(I_HOLD_LOCK()); + ASSERT_CANCEL_DISABLED(); if (available_markers_m1 <= 0) return; /* Skip if parallel markers disabled or already started. */ # ifdef CAN_HANDLE_FORK if (GC_parallel) return; + GC_wait_for_gc_completion(TRUE); /* Initialize mark_cv (for the first time), or cleanup its value */ /* after forking in the child process. All the marker threads in */ diff --git a/win32_threads.c b/win32_threads.c index 7fcee339..196bc7bf 100644 --- a/win32_threads.c +++ b/win32_threads.c @@ -2008,10 +2008,12 @@ GC_INNER void GC_get_next_stack(char *start, char *limit, # endif GC_ASSERT(I_HOLD_LOCK()); + ASSERT_CANCEL_DISABLED(); if (available_markers_m1 <= 0) return; /* Skip if parallel markers disabled or already started. */ # ifdef CAN_HANDLE_FORK if (GC_parallel) return; + GC_wait_for_gc_completion(TRUE); /* Reset mark_cv state after forking (as in pthread_support.c). */ { @@ -2181,6 +2183,7 @@ GC_INNER void GC_get_next_stack(char *start, char *limit, int i; GC_ASSERT(I_HOLD_LOCK()); + ASSERT_CANCEL_DISABLED(); if (available_markers_m1 <= 0) return; GC_ASSERT(GC_fl_builder_count == 0); |