diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2012-07-25 13:16:35 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2012-07-25 13:16:35 +0000 |
| commit | dfc8e52400498682f2ad995dada66a53d5d1e33f (patch) | |
| tree | a72e3dff6656a15cea503508ec5e8d2930956c81 | |
| parent | d654f066441386b28a8b7ba091434beed6495ae7 (diff) | |
| download | bcm5719-llvm-dfc8e52400498682f2ad995dada66a53d5d1e33f.tar.gz bcm5719-llvm-dfc8e52400498682f2ad995dada66a53d5d1e33f.zip | |
tsan: suport for Go finalizers
llvm-svn: 160723
| -rw-r--r-- | compiler-rt/lib/tsan/go/tsan_go.cc | 5 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_clock.cc | 5 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_clock.h | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl.h | 1 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc | 4 |
5 files changed, 17 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/go/tsan_go.cc b/compiler-rt/lib/tsan/go/tsan_go.cc index a0c52edb761..d0437d9efcf 100644 --- a/compiler-rt/lib/tsan/go/tsan_go.cc +++ b/compiler-rt/lib/tsan/go/tsan_go.cc @@ -221,5 +221,10 @@ void __tsan_event(int typ, int tid, void *pc, void *addr, int info) { } } +void __tsan_finalizer_goroutine(int tid) { + ThreadState *thr = goroutines[tid]; + ThreadFinalizerGoroutine(thr); +} + } // extern "C" } // namespace __tsan diff --git a/compiler-rt/lib/tsan/rtl/tsan_clock.cc b/compiler-rt/lib/tsan/rtl/tsan_clock.cc index e0f750fb1e9..1918f8df1fa 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_clock.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_clock.cc @@ -93,6 +93,11 @@ void ThreadClock::acq_rel(SyncClock *dst) { release(dst); } +void ThreadClock::Disable() { + for (uptr i = 0; i < kMaxTidInClock; i++) + clk_[i] = (u64)-1; +} + SyncClock::SyncClock() : clk_(MBlockClock) { } diff --git a/compiler-rt/lib/tsan/rtl/tsan_clock.h b/compiler-rt/lib/tsan/rtl/tsan_clock.h index 691185039b6..c6a8062562d 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_clock.h +++ b/compiler-rt/lib/tsan/rtl/tsan_clock.h @@ -61,6 +61,8 @@ struct ThreadClock { nclk_ = tid + 1; } + void Disable(); + uptr size() const { return nclk_; } diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.h b/compiler-rt/lib/tsan/rtl/tsan_rtl.h index 5cb95da1dd1..40643516f32 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl.h +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.h @@ -437,6 +437,7 @@ int ThreadTid(ThreadState *thr, uptr pc, uptr uid); 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/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc index 6756bd317ea..65449ffd99f 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc @@ -298,6 +298,10 @@ void ThreadDetach(ThreadState *thr, uptr pc, int tid) { } } +void ThreadFinalizerGoroutine(ThreadState *thr) { + thr->clock.Disable(); +} + void MemoryAccessRange(ThreadState *thr, uptr pc, uptr addr, uptr size, bool is_write) { if (size == 0) |

