[compiler-rt] r212565 - tsan: reapply 212531 and 212532 with a fix

Dmitry Vyukov dvyukov at google.com
Tue Jul 8 13:37:16 PDT 2014


Author: dvyukov
Date: Tue Jul  8 15:37:16 2014
New Revision: 212565

URL: http://llvm.org/viewvc/llvm-project?rev=212565&view=rev
Log:
tsan: reapply 212531 and 212532 with a fix
don't reset s->addr as well


Modified:
    compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc?rev=212565&r1=212564&r2=212565&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_sync.cc Tue Jul  8 15:37:16 2014
@@ -27,6 +27,7 @@ SyncVar::SyncVar()
 void SyncVar::Init(ThreadState *thr, uptr pc, uptr addr, u64 uid) {
   this->addr = addr;
   this->uid = uid;
+  this->next = 0;
 
   creation_stack_id = 0;
   if (kCppMode)  // Go does not use them
@@ -36,7 +37,6 @@ void SyncVar::Init(ThreadState *thr, upt
 }
 
 void SyncVar::Reset() {
-  addr = 0;
   uid = 0;
   creation_stack_id = 0;
   owner_tid = kInvalidTid;
@@ -46,7 +46,6 @@ void SyncVar::Reset() {
   is_recursive = 0;
   is_broken = 0;
   is_linker_init = 0;
-  next = 0;
 
   clock.Zero();
   read_clock.Reset();
@@ -134,7 +133,7 @@ SyncVar* MetaMap::GetAndLock(ThreadState
   u32 myidx = 0;
   SyncVar *mys = 0;
   for (;;) {
-    u32 idx = *meta;
+    u32 idx = idx0;
     for (;;) {
       if (idx == 0)
         break;
@@ -157,8 +156,10 @@ SyncVar* MetaMap::GetAndLock(ThreadState
     }
     if (!create)
       return 0;
-    if (*meta != idx0)
+    if (*meta != idx0) {
+      idx0 = *meta;
       continue;
+    }
 
     if (myidx == 0) {
       const u64 uid = atomic_fetch_add(&uid_gen_, 1, memory_order_relaxed);

Modified: compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc?rev=212565&r1=212564&r2=212565&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc Tue Jul  8 15:37:16 2014
@@ -108,4 +108,16 @@ TEST(MetaMap, MoveMemory) {
   m->FreeRange(thr, 0, (uptr)&block2[0], 4 * sizeof(u64));
 }
 
+TEST(MetaMap, ResetSync) {
+  ThreadState *thr = cur_thread();
+  MetaMap *m = &ctx->metamap;
+  u64 block[1] = {};  // fake malloc block
+  m->AllocBlock(thr, 0, (uptr)&block[0], 1 * sizeof(u64));
+  SyncVar *s = m->GetOrCreateAndLock(thr, 0, (uptr)&block[0], true);
+  s->Reset();
+  s->mtx.Unlock();
+  uptr sz = m->FreeBlock(thr, 0, (uptr)&block[0]);
+  EXPECT_EQ(sz, 1 * sizeof(u64));
+}
+
 }  // namespace __tsan





More information about the llvm-commits mailing list