diff options
-rw-r--r-- | lib/tsan/rtl/tsan_clock.cc | 6 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_clock.h | 3 |
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]; }; |