[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