]> granicus.if.org Git - gc/commitdiff
Workaround TSan hang in GC_free_inner when called from at-fork handler
authorIvan Maidanski <ivmai@mail.ru>
Wed, 22 Nov 2017 23:19:30 +0000 (02:19 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 22 Nov 2017 23:19:30 +0000 (02:19 +0300)
* pthread_support.c [CAN_HANDLE_FORK] (GC_remove_all_threads_but_me):
Do not call GC_INTERNAL_FREE(p) if THREAD_SANITIZER; add comment.

pthread_support.c

index 70b512af461a6ddcab30a28877becfa1da7c0071..c70ab7da7d8bf891794a974a3759ac24218cc6cb 100644 (file)
@@ -787,7 +787,11 @@ STATIC void GC_remove_all_threads_but_me(void)
               GC_remove_specific_after_fork(GC_thread_key, p -> id);
             }
 #         endif
-          if (p != &first_thread) GC_INTERNAL_FREE(p);
+          /* TODO: To avoid TSan hang (when updating GC_bytes_freed),   */
+          /* we just skip explicit free of GC_threads entries for now.  */
+#         ifndef THREAD_SANITIZER
+            if (p != &first_thread) GC_INTERNAL_FREE(p);
+#         endif
         }
       }
       GC_threads[hv] = me;