]> granicus.if.org Git - gc/commitdiff
Ensure GC initialized when atfork_prepare is called by client
authorIvan Maidanski <ivmai@mail.ru>
Fri, 23 Jun 2017 06:13:15 +0000 (09:13 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Sun, 2 Jul 2017 08:44:10 +0000 (11:44 +0300)
Otherwise, if THREAD_LOCAL_ALLOC, GC_remove_all_threads_but_me would
not find the current thread descriptor in GC_threads.

* pthread_support.c [CAN_HANDLE_FORK] (GC_atfork_prepare): Call GC_init
if not GC_is_initialized.
* win32_threads.c [CAN_HANDLE_FORK] (GC_atfork_prepare): Likewise.

pthread_support.c
win32_threads.c

index a5cad8319d2530f27289993492e1f9a40c712397..2c571256f88ef291a26b10e6bada3430d6d05599 100644 (file)
@@ -1061,6 +1061,7 @@ static void fork_child_proc(void)
   /* Routines for fork handling by client (no-op if pthread_atfork works). */
   GC_API void GC_CALL GC_atfork_prepare(void)
   {
+    if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
 #   if defined(GC_DARWIN_THREADS) && defined(MPROTECT_VDB)
       if (GC_dirty_maintained) {
         GC_ASSERT(0 == GC_handle_fork);
index 125c67fed8468e7f9eff03a7f95b7ad0f110bfa4..ab698b5b2a1492ddecb1d06b44c07d324d499106 100644 (file)
@@ -1110,6 +1110,7 @@ GC_API void * GC_CALL GC_call_with_gc_active(GC_fn_type fn,
   /* Routines for fork handling by client (no-op if pthread_atfork works). */
   GC_API void GC_CALL GC_atfork_prepare(void)
   {
+    if (!EXPECT(GC_is_initialized, TRUE)) GC_init();
     if (GC_handle_fork <= 0)
       fork_prepare_proc();
   }