[sanitizer] Move ScopedErrorReportLock into libcdep version

llvm-svn: 314039
This commit is contained in:
Vitaly Buka 2017-09-22 22:36:11 +00:00
parent 0187a8f6f9
commit a18f2ebdea
2 changed files with 37 additions and 37 deletions

View File

@ -348,43 +348,6 @@ static int InstallMallocFreeHooks(void (*malloc_hook)(const void *, uptr),
return 0;
}
static const u32 kUnclaimedTid = 0xfffffe;
static atomic_uint32_t reporting_thread_tid = {kUnclaimedTid};
ScopedErrorReportLock::ScopedErrorReportLock(u32 current_tid) {
for (;;) {
u32 expected_tid = kUnclaimedTid;
if (current_tid == kUnclaimedTid ||
atomic_compare_exchange_strong(&reporting_thread_tid, &expected_tid,
current_tid, memory_order_relaxed)) {
// We've claimed reporting_thread_tid_ so proceed.
CommonSanitizerReportMutex.Lock();
return;
}
if (expected_tid == current_tid) {
// This is either asynch signal or nested error during error reporting.
// Fail simple to avoid deadlocks in Report().
// Can't use Report() here because of potential deadlocks in nested
// signal handlers.
CatastrophicErrorWrite(SanitizerToolName,
internal_strlen(SanitizerToolName));
static const char msg[] = ": nested bug in the same thread, aborting.\n";
CatastrophicErrorWrite(msg, sizeof(msg) - 1);
internal__exit(common_flags()->exitcode);
}
internal_sched_yield();
}
}
ScopedErrorReportLock::~ScopedErrorReportLock() {
CommonSanitizerReportMutex.Unlock();
atomic_store_relaxed(&reporting_thread_tid, kUnclaimedTid);
}
} // namespace __sanitizer
using namespace __sanitizer; // NOLINT

View File

@ -286,6 +286,43 @@ void MaybeStartBackgroudThread() {
#endif
}
static const u32 kUnclaimedTid = 0xfffffe;
static atomic_uint32_t reporting_thread_tid = {kUnclaimedTid};
ScopedErrorReportLock::ScopedErrorReportLock(u32 current_tid) {
for (;;) {
u32 expected_tid = kUnclaimedTid;
if (current_tid == kUnclaimedTid ||
atomic_compare_exchange_strong(&reporting_thread_tid, &expected_tid,
current_tid, memory_order_relaxed)) {
// We've claimed reporting_thread_tid_ so proceed.
CommonSanitizerReportMutex.Lock();
return;
}
if (expected_tid == current_tid) {
// This is either asynch signal or nested error during error reporting.
// Fail simple to avoid deadlocks in Report().
// Can't use Report() here because of potential deadlocks in nested
// signal handlers.
CatastrophicErrorWrite(SanitizerToolName,
internal_strlen(SanitizerToolName));
static const char msg[] = ": nested bug in the same thread, aborting.\n";
CatastrophicErrorWrite(msg, sizeof(msg) - 1);
internal__exit(common_flags()->exitcode);
}
internal_sched_yield();
}
}
ScopedErrorReportLock::~ScopedErrorReportLock() {
CommonSanitizerReportMutex.Unlock();
atomic_store_relaxed(&reporting_thread_tid, kUnclaimedTid);
}
} // namespace __sanitizer
SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_sandbox_on_notify,