[compiler-rt] r207211 - tsan: better reports for "unlock of an unlocked mutex"
Dmitry Vyukov
dvyukov at google.com
Fri Apr 25 02:01:17 PDT 2014
Author: dvyukov
Date: Fri Apr 25 04:01:17 2014
New Revision: 207211
URL: http://llvm.org/viewvc/llvm-project?rev=207211&view=rev
Log:
tsan: better reports for "unlock of an unlocked mutex"
Modified:
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc?rev=207211&r1=207210&r2=207211&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_mutex.cc Fri Apr 25 04:01:17 2014
@@ -281,6 +281,7 @@ void MutexReadOrWriteUnlock(ThreadState
MemoryReadAtomic(thr, pc, addr, kSizeLog1);
SyncVar *s = ctx->synctab.GetOrCreateAndLock(thr, pc, addr, true);
bool write = true;
+ bool report_bad_unlock = false;
if (s->owner_tid == SyncVar::kInvalidTid) {
// Seems to be read unlock.
write = false;
@@ -303,16 +304,18 @@ void MutexReadOrWriteUnlock(ThreadState
}
} else if (!s->is_broken) {
s->is_broken = true;
- Printf("ThreadSanitizer WARNING: mutex %p is unlock by wrong thread\n",
- addr);
- PrintCurrentStack(thr, pc);
+ report_bad_unlock = true;
}
thr->mset.Del(s->GetId(), write);
if (flags()->detect_deadlocks && s->recursion == 0) {
Callback cb(thr, pc);
ctx->dd->MutexBeforeUnlock(&cb, &s->dd, write);
}
+ u64 mid = s->GetId();
s->mtx.Unlock();
+ // Can't touch s after this point.
+ if (report_bad_unlock)
+ ReportMutexMisuse(thr, pc, ReportTypeMutexBadUnlock, addr, mid);
if (flags()->detect_deadlocks) {
Callback cb(thr, pc);
ReportDeadlock(thr, pc, ctx->dd->GetReport(&cb));
More information about the llvm-commits
mailing list