summaryrefslogtreecommitdiff
path: root/dbg_mlc.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2017-11-17 11:07:03 +0300
committerIvan Maidanski <ivmai@mail.ru>2017-11-17 11:07:03 +0300
commitd9df01a6829fac03bb35469895b17c1ab5adb828 (patch)
treef0586903060c98eb3fcf59ae4bb6b320248d3604 /dbg_mlc.c
parent8a6343236708bd31f4371b4ce68438433c72ffb1 (diff)
downloadbdwgc-d9df01a6829fac03bb35469895b17c1ab5adb828.tar.gz
Eliminate TSan warning about data race when accessing GC_debugging_started
Now GC_debugging_started variable is double-checked with the allocation lock held before calling GC_start_debugging_inner. * dbg_mlc.c (GC_start_debugging_inner): Define as GC_INNER (instead of STATIC). * dbg_mlc.c [THREADS] (GC_start_debugging): Define as STATIC; do not call GC_start_debugging_inner() if GC_debugging_started. * dbg_mlc.c [!THREADS] (GC_start_debugging): Define as macro (redirect to GC_start_debugging_inner). * gcj_mlc.c (GC_debug_gcj_malloc): Call GC_start_debugging_inner (holding the lock) instead of GC_start_debugging. * include/private/gc_priv.h (GC_start_debugging): Rename to GC_start_debugging_inner; improve usage comment.
Diffstat (limited to 'dbg_mlc.c')
-rw-r--r--dbg_mlc.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/dbg_mlc.c b/dbg_mlc.c
index c22435ae..085ba2e7 100644
--- a/dbg_mlc.c
+++ b/dbg_mlc.c
@@ -465,7 +465,7 @@ STATIC void GC_debug_print_heap_obj_proc(ptr_t p)
STATIC void GC_do_nothing(void) {}
#endif
-STATIC void GC_start_debugging_inner(void)
+GC_INNER void GC_start_debugging_inner(void)
{
GC_ASSERT(I_HOLD_LOCK());
# ifndef SHORT_DBG_HDRS
@@ -480,14 +480,19 @@ STATIC void GC_start_debugging_inner(void)
GC_register_displacement_inner((word)sizeof(oh));
}
-GC_INNER void GC_start_debugging(void)
-{
- DCL_LOCK_STATE;
+#ifdef THREADS
+ STATIC void GC_start_debugging(void)
+ {
+ DCL_LOCK_STATE;
- LOCK();
- GC_start_debugging_inner();
- UNLOCK();
-}
+ LOCK();
+ if (!GC_debugging_started)
+ GC_start_debugging_inner();
+ UNLOCK();
+ }
+#else
+# define GC_start_debugging GC_start_debugging_inner
+#endif /* !THREADS */
size_t GC_debug_header_size = sizeof(oh);