diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2017-11-17 11:07:03 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2017-11-17 11:07:03 +0300 |
commit | d9df01a6829fac03bb35469895b17c1ab5adb828 (patch) | |
tree | f0586903060c98eb3fcf59ae4bb6b320248d3604 /dbg_mlc.c | |
parent | 8a6343236708bd31f4371b4ce68438433c72ffb1 (diff) | |
download | bdwgc-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.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -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); |