summaryrefslogtreecommitdiffstats
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
commit67ccf9851c9494d5f5811187bfc26856ad597788 (patch)
treeb61d908491e635396e7bcf7d68e23f7823677ef3
parentcb1ad6f58240cceb5d387f0ce13e49e496662553 (diff)
downloadbcm5719-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.cc9
-rw-r--r--compiler-rt/lib/tsan/tests/unit/tsan_sync_test.cc12
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
OpenPOWER on IntegriCloud