diff --git a/compiler-rt/lib/tsan/rtl/tsan_fd.cpp b/compiler-rt/lib/tsan/rtl/tsan_fd.cpp index cf8f491fdbf094cda1ce2f281b35951d3be36323..f69314e0376273010eea27d9f2a3e7f539651b6f 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_fd.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_fd.cpp @@ -212,7 +212,7 @@ void FdClose(ThreadState *thr, uptr pc, int fd, bool write) { { // Need to lock the slot to make MemoryAccess and MemoryResetRange atomic // with respect to global reset. See the comment in MemoryRangeFreed. - SlotLocker locker(thr); + SlotLocker locker(thr, thr->ignore_interceptors > 0); // OHOS_LOCAL if (!MustIgnoreInterceptor(thr)) { if (write) { // To catch races between fd usage and close. diff --git a/compiler-rt/lib/tsan/rtl/tsan_mman.cpp b/compiler-rt/lib/tsan/rtl/tsan_mman.cpp index 0937e521193f46f47e673c74651aa427221d3bb8..ca3458c4555e5a96900e7e217d470e2f7da2c2ef 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_mman.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_mman.cpp @@ -269,7 +269,7 @@ void OnUserFree(ThreadState *thr, uptr pc, uptr p, bool write) { DPrintf("#%d: free(0x%zx, %zu) (no slot)\n", thr->tid, p, sz); return; } - SlotLocker locker(thr); + SlotLocker locker(thr, thr->ignore_interceptors > 0); // OHOS_LOCAL uptr sz = ctx->metamap.FreeBlock(thr->proc(), p, true); DPrintf("#%d: free(0x%zx, %zu)\n", thr->tid, p, sz); if (write && thr->ignore_reads_and_writes == 0) diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp index 646dec64864b0f211c71dade824914c19ebd32b6..c21c5b6ab05a1d333e7de79f38989c7e45bc23cb 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp @@ -801,6 +801,7 @@ int Finalize(ThreadState *thr) { ThreadFinalize(thr); + thr->ignore_interceptors++; // OHOS_LOCAL if (ctx->nreported) { failed = true; #if !SANITIZER_GO @@ -815,7 +816,7 @@ int Finalize(ThreadState *thr) { failed = OnFinalize(failed); Report("End Tsan report (Finalize)\n"); // OHOS_LOCAL - + thr->ignore_interceptors--; // OHOS_LOCAL return failed ? common_flags()->exitcode : 0; } diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cpp index 2e978852ea7d379c4ec408f00cdfeb177144bbae..1d02b81b886f47b8f27a0e6c1bb66e679337699b 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cpp @@ -464,7 +464,7 @@ void Release(ThreadState *thr, uptr pc, uptr addr) { DPrintf("#%d: Release %zx\n", thr->tid, addr); if (thr->ignore_sync) return; - SlotLocker locker(thr); + SlotLocker locker(thr, thr->ignore_interceptors > 0); // OHOS_LOCAL { auto s = ctx->metamap.GetSyncOrCreate(thr, pc, addr, false); Lock lock(&s->mtx); @@ -477,7 +477,7 @@ void ReleaseStore(ThreadState *thr, uptr pc, uptr addr) { DPrintf("#%d: ReleaseStore %zx\n", thr->tid, addr); if (thr->ignore_sync) return; - SlotLocker locker(thr); + SlotLocker locker(thr, thr->ignore_interceptors > 0); // OHOS_LOCAL { auto s = ctx->metamap.GetSyncOrCreate(thr, pc, addr, false); Lock lock(&s->mtx); @@ -490,7 +490,7 @@ void ReleaseStoreAcquire(ThreadState *thr, uptr pc, uptr addr) { DPrintf("#%d: ReleaseStoreAcquire %zx\n", thr->tid, addr); if (thr->ignore_sync) return; - SlotLocker locker(thr); + SlotLocker locker(thr, thr->ignore_interceptors > 0); // OHOS_LOCAL { auto s = ctx->metamap.GetSyncOrCreate(thr, pc, addr, false); Lock lock(&s->mtx); @@ -558,6 +558,7 @@ void ReportDestroyLocked(ThreadState *thr, uptr pc, uptr addr, Lock slot_lock(&ctx->slots[static_cast(last_lock.sid())].mtx); ThreadRegistryLock l0(&ctx->thread_registry); Lock slots_lock(&ctx->slot_mtx); + thr->slot_locked = true; // OHOS_LOCAL ScopedReport rep(ReportTypeMutexDestroyLocked); rep.AddMutex(addr, creation_stack_id); VarSizeStackTrace trace; @@ -573,6 +574,7 @@ void ReportDestroyLocked(ThreadState *thr, uptr pc, uptr addr, rep.AddStack(trace, true); rep.AddLocation(addr, 1); OutputReport(thr, rep); + thr->slot_locked = false; // OHOS_LOCAL } } // namespace __tsan diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp index 706b12a841e1b8da8cecc41b64dfa6a88a11b4ca..4973b3b0805912a30c1ebf0426a3cb5ccc31d8a0 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp @@ -656,6 +656,7 @@ bool OutputReport(ThreadState *thr, const ScopedReport &srep) { VPrintf(2, "[Suppression] Suppression hit type:%s file:%s pc:0x%zx.\n", supp->type, supp->templ, pc_or_addr); } + thr->ignore_interceptors++; // OHOS_LOCAL { bool suppressed = OnReport(rep, pc_or_addr != 0); if (suppressed) { @@ -664,6 +665,7 @@ bool OutputReport(ThreadState *thr, const ScopedReport &srep) { } } PrintReport(rep); + thr->ignore_interceptors--; // OHOS_LOCAL __tsan_on_report(rep); ctx->nreported++; if (flags()->halt_on_error)