diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2014-07-08 20:37:16 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2014-07-08 20:37:16 +0000 |
| commit | 67ccf9851c9494d5f5811187bfc26856ad597788 (patch) | |
| tree | b61d908491e635396e7bcf7d68e23f7823677ef3 | |
| parent | cb1ad6f58240cceb5d387f0ce13e49e496662553 (diff) | |
| download | bcm5719-llvm-67ccf9851c9494d5f5811187bfc26856ad597788.tar.gz bcm5719-llvm-67ccf9851c9494d5f5811187bfc26856ad597788.zip | |
tsan: reapply 212531 and 212532 with a fix
don't reset s->addr as well
llvm-svn: 212565
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_sync.cc | 9 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/tests/unit/tsan_sync_test.cc | 12 |
2 files changed, 17 insertions, 4 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_sync.cc b/compiler-rt/lib/tsan/rtl/tsan_sync.cc index 8c48cadfb86..10f52b48908 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_sync.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_sync.cc @@ -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, uptr pc, uptr addr, u64 uid) { } 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 *thr, uptr pc, 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 *thr, uptr pc, } 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); diff --git a/compiler-rt/lib/tsan/tests/unit/tsan_sync_test.cc b/compiler-rt/lib/tsan/tests/unit/tsan_sync_test.cc index 664ce7f0dbc..6f36c64a556 100644 --- a/compiler-rt/lib/tsan/tests/unit/tsan_sync_test.cc +++ b/compiler-rt/lib/tsan/tests/unit/tsan_sync_test.cc @@ -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 |

