diff options
Diffstat (limited to 'compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc')
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc index 74aec4e6afe..89098a885b7 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc +++ b/compiler-rt/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); |

