summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2012-11-06 13:16:25 +0000
committerDmitry Vyukov <dvyukov@google.com>2012-11-06 13:16:25 +0000
commit1e99374ba2a4fdec2c0d14197a204b3f75e60565 (patch)
tree6c5ded8589d361d8bd850edddc93077d0cbc4ffb
parente2462f7461961925f7f20577352c01e867365d8b (diff)
downloadcompiler-rt-1e99374ba2a4fdec2c0d14197a204b3f75e60565.tar.gz
tsan: don't release disabled clocks
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@167451 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/tsan/rtl/tsan_clock.cc6
-rw-r--r--lib/tsan/rtl/tsan_clock.h3
2 files changed, 8 insertions, 1 deletions
diff --git a/lib/tsan/rtl/tsan_clock.cc b/lib/tsan/rtl/tsan_clock.cc
index 32ed91dc2..89e788d27 100644
--- a/lib/tsan/rtl/tsan_clock.cc
+++ b/lib/tsan/rtl/tsan_clock.cc
@@ -58,6 +58,7 @@ namespace __tsan {
ThreadClock::ThreadClock() {
nclk_ = 0;
+ disabled_ = false;
for (uptr i = 0; i < (uptr)kMaxTidInClock; i++)
clk_[i] = 0;
}
@@ -80,6 +81,8 @@ void ThreadClock::release(SyncClock *dst) const {
DCHECK(nclk_ <= kMaxTid);
DCHECK(dst->clk_.Size() <= kMaxTid);
+ if (disabled_)
+ return;
if (dst->clk_.Size() < nclk_)
dst->clk_.Resize(nclk_);
for (uptr i = 0; i < nclk_; i++) {
@@ -92,6 +95,8 @@ void ThreadClock::ReleaseStore(SyncClock *dst) const {
DCHECK(nclk_ <= kMaxTid);
DCHECK(dst->clk_.Size() <= kMaxTid);
+ if (disabled_)
+ return;
if (dst->clk_.Size() < nclk_)
dst->clk_.Resize(nclk_);
for (uptr i = 0; i < nclk_; i++)
@@ -106,6 +111,7 @@ void ThreadClock::acq_rel(SyncClock *dst) {
}
void ThreadClock::Disable(unsigned tid) {
+ disabled_ = true;
u64 c0 = clk_[tid];
for (uptr i = 0; i < kMaxTidInClock; i++)
clk_[i] = (u64)-1;
diff --git a/lib/tsan/rtl/tsan_clock.h b/lib/tsan/rtl/tsan_clock.h
index 02ddb9abd..38a99db95 100644
--- a/lib/tsan/rtl/tsan_clock.h
+++ b/lib/tsan/rtl/tsan_clock.h
@@ -48,7 +48,7 @@ struct ThreadClock {
void set(unsigned tid, u64 v) {
DCHECK_LT(tid, kMaxTid);
- DCHECK_GE(v, clk_[tid]);
+ DCHECK(v >= clk_[tid] || disabled_);
clk_[tid] = v;
if (nclk_ <= tid)
nclk_ = tid + 1;
@@ -74,6 +74,7 @@ struct ThreadClock {
private:
uptr nclk_;
+ bool disabled_;
u64 clk_[kMaxTidInClock];
};