diff options
author | Kostya Serebryany <kcc@google.com> | 2014-02-25 07:34:41 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2014-02-25 07:34:41 +0000 |
commit | 105e5bca9a1846e65869289b87aaf92f124133d6 (patch) | |
tree | f22b4cd95c90b1a0580cb3e23f8da9f9d50ad672 /lib/tsan/rtl/tsan_rtl_mutex.cc | |
parent | cacf27d297ebbbdb8f3e22ca309edd211bf75747 (diff) |
[sanitizer] fix epoch handling in deadlock detector (before the fix, we could have had edges from locks in the previous epoch to locks in the current epoch)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@202118 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 | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/tsan/rtl/tsan_rtl_mutex.cc b/lib/tsan/rtl/tsan_rtl_mutex.cc index 74aec4e6a..89098a885 100644 --- a/lib/tsan/rtl/tsan_rtl_mutex.cc +++ b/lib/tsan/rtl/tsan_rtl_mutex.cc @@ -22,10 +22,11 @@ namespace __tsan { - -static void EnsureDeadlockDetectorID(Context *ctx, SyncVar *s) { +static void EnsureDeadlockDetectorID(Context *ctx, ThreadState *thr, + SyncVar *s) { if (!ctx->dd.nodeBelongsToCurrentEpoch(s->deadlock_detector_id)) s->deadlock_detector_id = ctx->dd.newNode(reinterpret_cast<uptr>(s)); + ctx->dd.ensureCurrentEpoch(&thr->deadlock_detector_tls); } void MutexCreate(ThreadState *thr, uptr pc, uptr addr, @@ -121,7 +122,7 @@ void MutexLock(ThreadState *thr, uptr pc, uptr addr, int rec) { thr->mset.Add(s->GetId(), true, thr->fast_state.epoch()); if (common_flags()->detect_deadlocks) { Lock lk(&ctx->dd_mtx); - EnsureDeadlockDetectorID(ctx, s); + EnsureDeadlockDetectorID(ctx, thr, s); if (ctx->dd.isHeld(&thr->deadlock_detector_tls, s->deadlock_detector_id)) { // FIXME: add tests, handle the real recursive locks. Printf("ThreadSanitizer: reursive-lock\n"); @@ -184,7 +185,7 @@ int MutexUnlock(ThreadState *thr, uptr pc, uptr addr, bool all) { thr->mset.Del(s->GetId(), true); if (common_flags()->detect_deadlocks) { Lock lk(&ctx->dd_mtx); - EnsureDeadlockDetectorID(ctx, s); + EnsureDeadlockDetectorID(ctx, thr, s); // Printf("MutexUnlock: %zx\n", s->deadlock_detector_id); ctx->dd.onUnlock(&thr->deadlock_detector_tls, s->deadlock_detector_id); |