]> granicus.if.org Git - gc/commitdiff
Workaround TSan false positive about read of mark_lock_holder
authorIvan Maidanski <ivmai@mail.ru>
Wed, 29 Nov 2017 21:51:40 +0000 (00:51 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 29 Nov 2017 21:51:40 +0000 (00:51 +0300)
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
win32_threads.c

index b6489fc17ab7034a5237a1dbbcb9ed3a32fa768b..9105bcd7dbe6bc6dc6c68789078ce4530bf54be6 100644 (file)
@@ -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);
index 4f15ca194f76b94db6a84f0808132a5348b11089..40eee3c4daca0057c0e143eb533b13f6289254a5 100644 (file)
@@ -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);