tsan: suport for Go finalizers
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@160723 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/tsan/go/tsan_go.cc b/lib/tsan/go/tsan_go.cc
index a0c52ed..d0437d9 100644
--- a/lib/tsan/go/tsan_go.cc
+++ b/lib/tsan/go/tsan_go.cc
@@ -221,5 +221,10 @@
}
}
+void __tsan_finalizer_goroutine(int tid) {
+ ThreadState *thr = goroutines[tid];
+ ThreadFinalizerGoroutine(thr);
+}
+
} // extern "C"
} // namespace __tsan
diff --git a/lib/tsan/rtl/tsan_clock.cc b/lib/tsan/rtl/tsan_clock.cc
index e0f750f..1918f8d 100644
--- a/lib/tsan/rtl/tsan_clock.cc
+++ b/lib/tsan/rtl/tsan_clock.cc
@@ -93,6 +93,11 @@
release(dst);
}
+void ThreadClock::Disable() {
+ for (uptr i = 0; i < kMaxTidInClock; i++)
+ clk_[i] = (u64)-1;
+}
+
SyncClock::SyncClock()
: clk_(MBlockClock) {
}
diff --git a/lib/tsan/rtl/tsan_clock.h b/lib/tsan/rtl/tsan_clock.h
index 6911850..c6a8062 100644
--- a/lib/tsan/rtl/tsan_clock.h
+++ b/lib/tsan/rtl/tsan_clock.h
@@ -61,6 +61,8 @@
nclk_ = tid + 1;
}
+ void Disable();
+
uptr size() const {
return nclk_;
}
diff --git a/lib/tsan/rtl/tsan_rtl.h b/lib/tsan/rtl/tsan_rtl.h
index 5cb95da..4064351 100644
--- a/lib/tsan/rtl/tsan_rtl.h
+++ b/lib/tsan/rtl/tsan_rtl.h
@@ -437,6 +437,7 @@
void ThreadJoin(ThreadState *thr, uptr pc, int tid);
void ThreadDetach(ThreadState *thr, uptr pc, int tid);
void ThreadFinalize(ThreadState *thr);
+void ThreadFinalizerGoroutine(ThreadState *thr);
void MutexCreate(ThreadState *thr, uptr pc, uptr addr, bool rw, bool recursive);
void MutexDestroy(ThreadState *thr, uptr pc, uptr addr);
diff --git a/lib/tsan/rtl/tsan_rtl_thread.cc b/lib/tsan/rtl/tsan_rtl_thread.cc
index 6756bd3..65449ff 100644
--- a/lib/tsan/rtl/tsan_rtl_thread.cc
+++ b/lib/tsan/rtl/tsan_rtl_thread.cc
@@ -298,6 +298,10 @@
}
}
+void ThreadFinalizerGoroutine(ThreadState *thr) {
+ thr->clock.Disable();
+}
+
void MemoryAccessRange(ThreadState *thr, uptr pc, uptr addr,
uptr size, bool is_write) {
if (size == 0)