From ba827dfdaedffb20844c997abed43c02c3279a37 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 6 Nov 2012 13:16:25 +0000 Subject: [PATCH] tsan: don't release disabled clocks llvm-svn: 167451 --- compiler-rt/lib/tsan/rtl/tsan_clock.cc | 6 ++++++ compiler-rt/lib/tsan/rtl/tsan_clock.h | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler-rt/lib/tsan/rtl/tsan_clock.cc b/compiler-rt/lib/tsan/rtl/tsan_clock.cc index 32ed91dc2103..89e788d27658 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_clock.cc +++ b/compiler-rt/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/compiler-rt/lib/tsan/rtl/tsan_clock.h b/compiler-rt/lib/tsan/rtl/tsan_clock.h index 02ddb9abdb30..38a99db9538d 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_clock.h +++ b/compiler-rt/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]; };