diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2013-02-01 14:41:58 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2013-02-01 14:41:58 +0000 |
commit | 3285866e45a8521c56ba6209daf3c9f91f844fd3 (patch) | |
tree | a3c95216e2cfaed046c62bc4e13bc9ef2983e3c6 /lib/tsan/rtl/tsan_rtl_mutex.cc | |
parent | 0a07b354fe95d50911c620b42fc031868ef15cc1 (diff) | |
download | compiler-rt-3285866e45a8521c56ba6209daf3c9f91f844fd3.tar.gz compiler-rt-3285866e45a8521c56ba6209daf3c9f91f844fd3.tar.bz2 compiler-rt-3285866e45a8521c56ba6209daf3c9f91f844fd3.tar.xz |
tsan: even if races between atomic and plain memory accesses are turned off (report_atomic_races=0),
still report races between atomic accesses and free().
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@174175 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_rtl_mutex.cc')
-rw-r--r-- | lib/tsan/rtl/tsan_rtl_mutex.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/tsan/rtl/tsan_rtl_mutex.cc b/lib/tsan/rtl/tsan_rtl_mutex.cc index 6c86b066..a07f6a2a 100644 --- a/lib/tsan/rtl/tsan_rtl_mutex.cc +++ b/lib/tsan/rtl/tsan_rtl_mutex.cc @@ -26,8 +26,12 @@ void MutexCreate(ThreadState *thr, uptr pc, uptr addr, CHECK_GT(thr->in_rtl, 0); DPrintf("#%d: MutexCreate %zx\n", thr->tid, addr); StatInc(thr, StatMutexCreate); - if (!linker_init && IsAppMem(addr)) + if (!linker_init && IsAppMem(addr)) { + CHECK(!thr->is_freeing); + thr->is_freeing = true; MemoryWrite(thr, pc, addr, kSizeLog1); + thr->is_freeing = false; + } SyncVar *s = ctx->synctab.GetOrCreateAndLock(thr, pc, addr, true); s->is_rw = rw; s->is_recursive = recursive; @@ -49,8 +53,12 @@ void MutexDestroy(ThreadState *thr, uptr pc, uptr addr) { SyncVar *s = ctx->synctab.GetAndRemove(thr, pc, addr); if (s == 0) return; - if (IsAppMem(addr)) + if (IsAppMem(addr)) { + CHECK(!thr->is_freeing); + thr->is_freeing = true; MemoryWrite(thr, pc, addr, kSizeLog1); + thr->is_freeing = false; + } if (flags()->report_destroy_locked && s->owner_tid != SyncVar::kInvalidTid && !s->is_broken) { |