diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-05-19 09:38:30 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-05-19 13:39:23 +0300 |
commit | 0eeb939afc780d838e346b70ff26dd43c82bb26e (patch) | |
tree | a81ec25ffb97f88fdf3223c9731231842d144320 /win32_threads.c | |
parent | a8b96ed7655169757765433dee919824ccc62c36 (diff) | |
download | bdwgc-0eeb939afc780d838e346b70ff26dd43c82bb26e.tar.gz |
Prevent changing of GC_markers_m1 value while collection in progress
GC_markers_m1 (GC_parallel) value affects some logic in the garbage
collector, e.g. GC_clear_fl_marks, so it would be safer to wait for any
ongoing collection before proceeding with marker threads creation (in
the child).
* pthread_support.c [PARALLEL_MARK && CAN_HANDLE_FORK]
(GC_wait_for_gc_completion): Declare (before
GC_start_mark_threads_inner).
* pthread_support.c [PARALLEL_MARK] (GC_start_mark_threads_inner): Add
assertion that cancellation is disabled.
* win32_threads.c [PARALLEL_MARK] (GC_start_mark_threads_inner):
Likewise.
* pthread_support.c [PARALLEL_MARK && CAN_HANDLE_FORK]
(GC_start_mark_threads_inner): Call GC_wait_for_gc_completion(TRUE)
before initialization of mark_cv.
* win32_threads.c [PARALLEL_MARK && GC_PTHREADS_PARAMARK
&& CAN_HANDLE_FORK] (GC_start_mark_threads_inner): Likewise.
Diffstat (limited to 'win32_threads.c')
-rw-r--r-- | win32_threads.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/win32_threads.c b/win32_threads.c index dad450ab..2a415ac7 100644 --- a/win32_threads.c +++ b/win32_threads.c @@ -2132,10 +2132,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). */ { @@ -2305,6 +2307,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); |