diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-03-18 07:02:08 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-03-18 07:02:08 +0000 |
commit | 4f1c8a13d5d0b9e313b0cba3057256bdd5b4859d (patch) | |
tree | cc0b1222a308482b66e5c33882dc9b6c677d6411 | |
parent | e1955b851d55189d8a0124ae19424ab7323370f9 (diff) | |
download | bcm5719-llvm-4f1c8a13d5d0b9e313b0cba3057256bdd5b4859d.tar.gz bcm5719-llvm-4f1c8a13d5d0b9e313b0cba3057256bdd5b4859d.zip |
[TSan] Use ThreadRegistry::FindThreadContextLocked() to find thread by its stack/tls address.
llvm-svn: 177248
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc index 69fd16bbd4c..01b7a02646c 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc @@ -192,7 +192,7 @@ void ScopedReport::AddThread(const ThreadContext *tctx) { } #ifndef TSAN_GO -static ThreadContext *FindThreadLocked(int unique_id) { +static ThreadContext *FindThreadByUidLocked(int unique_id) { Context *ctx = CTX(); ctx->thread_registry->CheckLocked(); for (unsigned i = 0; i < kMaxTid; i++) { @@ -205,26 +205,29 @@ static ThreadContext *FindThreadLocked(int unique_id) { return 0; } +static bool IsInStackOrTls(ThreadContextBase *tctx_base, void *arg) { + uptr addr = (uptr)arg; + ThreadContext *tctx = static_cast<ThreadContext*>(tctx_base); + if (tctx->status != ThreadStatusRunning) + return false; + ThreadState *thr = tctx->thr; + CHECK(thr); + return ((addr >= thr->stk_addr && addr < thr->stk_addr + thr->stk_size) || + (addr >= thr->tls_addr && addr < thr->tls_addr + thr->tls_size)); +} + ThreadContext *IsThreadStackOrTls(uptr addr, bool *is_stack) { Context *ctx = CTX(); ctx->thread_registry->CheckLocked(); - for (unsigned i = 0; i < kMaxTid; i++) { - ThreadContext *tctx = static_cast<ThreadContext*>( - ctx->thread_registry->GetThreadLocked(i)); - if (tctx == 0 || tctx->status != ThreadStatusRunning) - continue; - ThreadState *thr = tctx->thr; - CHECK(thr); - if (addr >= thr->stk_addr && addr < thr->stk_addr + thr->stk_size) { - *is_stack = true; - return tctx; - } - if (addr >= thr->tls_addr && addr < thr->tls_addr + thr->tls_size) { - *is_stack = false; - return tctx; - } - } - return 0; + ThreadContext *tctx = static_cast<ThreadContext*>( + ctx->thread_registry->FindThreadContextLocked(IsInStackOrTls, + (void*)addr)); + if (!tctx) + return 0; + ThreadState *thr = tctx->thr; + CHECK(thr); + *is_stack = (addr >= thr->stk_addr && addr < thr->stk_addr + thr->stk_size); + return tctx; } #endif @@ -276,14 +279,14 @@ void ScopedReport::AddLocation(uptr addr, uptr size) { trace.Init(stack, ssz); loc->stack = SymbolizeStack(trace); } - ThreadContext *tctx = FindThreadLocked(creat_tid); + ThreadContext *tctx = FindThreadByUidLocked(creat_tid); if (tctx) AddThread(tctx); return; } if (allocator()->PointerIsMine((void*)addr)) { MBlock *b = user_mblock(0, (void*)addr); - ThreadContext *tctx = FindThreadLocked(b->alloc_tid); + ThreadContext *tctx = FindThreadByUidLocked(b->alloc_tid); void *mem = internal_alloc(MBlockReportLoc, sizeof(ReportLocation)); ReportLocation *loc = new(mem) ReportLocation(); rep_->locs.PushBack(loc); |