summaryrefslogtreecommitdiff
path: root/lib/tsan/rtl/tsan_sync.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2014-07-08 20:37:16 +0000
committerDmitry Vyukov <dvyukov@google.com>2014-07-08 20:37:16 +0000
commitc212f82219e7463adf999a1688876fb7ec416ad1 (patch)
treefd4f3e8122a203f05d7887afe481cd980325b81e /lib/tsan/rtl/tsan_sync.cc
parenta23f33bb20043f95685f3fc8c0cfc23f499f8faa (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.cc9
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);