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 | c212f82219e7463adf999a1688876fb7ec416ad1 (patch) | |
tree | fd4f3e8122a203f05d7887afe481cd980325b81e /lib/tsan/rtl/tsan_sync.cc | |
parent | a23f33bb20043f95685f3fc8c0cfc23f499f8faa (diff) |
tsan: reapply 212531 and 212532 with a fix
don't reset s->addr as well
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@212565 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_sync.cc')
-rw-r--r-- | lib/tsan/rtl/tsan_sync.cc | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/tsan/rtl/tsan_sync.cc b/lib/tsan/rtl/tsan_sync.cc index 8c48cadfb..10f52b489 100644 --- a/lib/tsan/rtl/tsan_sync.cc +++ b/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); |