From 0fbe44656a2b096e50e29d493cf21d4da3447638 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Thu, 30 Nov 2017 00:51:40 +0300 Subject: [PATCH] Workaround TSan false positive about read of mark_lock_holder The assertion should not be violated in GC_acquire_mark_lock even reading from GC_mark_lock_holder is done before acquiring the mark lock. * pthread_support.c [PARALLEL_MARK && NUMERIC_THREAD_ID_UNIQUE] (GC_acquire_mark_lock): Skip assertion on GC_mark_lock_holder (before acquiring the lock) if THREAD_SANITIZER. * win32_threads.c [PARALLEL_MARK] (GC_acquire_mark_lock): Likewise. --- pthread_support.c | 2 +- win32_threads.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pthread_support.c b/pthread_support.c index b6489fc..9105bcd 100644 --- a/pthread_support.c +++ b/pthread_support.c @@ -2174,7 +2174,7 @@ static void setup_mark_lock(void) GC_INNER void GC_acquire_mark_lock(void) { -# ifdef NUMERIC_THREAD_ID_UNIQUE +# if defined(NUMERIC_THREAD_ID_UNIQUE) && !defined(THREAD_SANITIZER) GC_ASSERT(GC_mark_lock_holder != NUMERIC_THREAD_ID(pthread_self())); # endif GC_generic_lock(&mark_mutex); diff --git a/win32_threads.c b/win32_threads.c index 4f15ca1..40eee3c 100644 --- a/win32_threads.c +++ b/win32_threads.c @@ -1890,7 +1890,7 @@ GC_INNER void GC_get_next_stack(char *start, char *limit, GC_INNER void GC_acquire_mark_lock(void) { -# ifdef NUMERIC_THREAD_ID_UNIQUE +# if defined(NUMERIC_THREAD_ID_UNIQUE) && !defined(THREAD_SANITIZER) GC_ASSERT(GC_mark_lock_holder != NUMERIC_THREAD_ID(pthread_self())); # endif if (pthread_mutex_lock(&mark_mutex) != 0) { @@ -2068,7 +2068,9 @@ GC_INNER void GC_get_next_stack(char *start, char *limit, GC_INNER void GC_acquire_mark_lock(void) { - GC_ASSERT(GC_mark_lock_holder != GetCurrentThreadId()); +# ifndef THREAD_SANITIZER + GC_ASSERT(GC_mark_lock_holder != GetCurrentThreadId()); +# endif if (InterlockedExchange(&GC_mark_mutex_state, 1 /* locked */) != 0) { # ifdef LOCK_STATS (void)AO_fetch_and_add1(&GC_block_count); -- 2.7.4