[sanitizer] Replace thread id with GetThreadSelf
This allows to avoid constructor parameter llvm-svn: 314040
This commit is contained in:
parent
a18f2ebdea
commit
a33e156f81
|
@ -122,12 +122,8 @@ bool ParseFrameDescription(const char *frame_descr,
|
|||
// immediately after printing error report.
|
||||
class ScopedInErrorReport {
|
||||
public:
|
||||
static const u32 kUnclaimedTid = 0xfffffe;
|
||||
static_assert(kUnclaimedTid != kInvalidTid, "Must be different");
|
||||
|
||||
explicit ScopedInErrorReport(bool fatal = false)
|
||||
: error_report_lock_(GetCurrentTidOrInvalid()),
|
||||
halt_on_error_(fatal || flags()->halt_on_error) {
|
||||
: halt_on_error_(fatal || flags()->halt_on_error) {
|
||||
// Make sure the registry and sanitizer report mutexes are locked while
|
||||
// we're printing an error report.
|
||||
// We can lock them only here to avoid self-deadlock in case of
|
||||
|
|
|
@ -211,7 +211,7 @@ extern StaticSpinMutex CommonSanitizerReportMutex;
|
|||
// Lock sanitizer error reporting and protects against nested errors.
|
||||
class ScopedErrorReportLock {
|
||||
public:
|
||||
explicit ScopedErrorReportLock(u32 current_tid);
|
||||
ScopedErrorReportLock();
|
||||
~ScopedErrorReportLock();
|
||||
};
|
||||
|
||||
|
|
|
@ -286,21 +286,20 @@ void MaybeStartBackgroudThread() {
|
|||
#endif
|
||||
}
|
||||
|
||||
static const u32 kUnclaimedTid = 0xfffffe;
|
||||
static atomic_uint32_t reporting_thread_tid = {kUnclaimedTid};
|
||||
static atomic_uintptr_t reporting_thread = {0};
|
||||
|
||||
ScopedErrorReportLock::ScopedErrorReportLock(u32 current_tid) {
|
||||
ScopedErrorReportLock::ScopedErrorReportLock() {
|
||||
uptr current = GetThreadSelf();
|
||||
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.
|
||||
uptr expected = 0;
|
||||
if (atomic_compare_exchange_strong(&reporting_thread, &expected, current,
|
||||
memory_order_relaxed)) {
|
||||
// We've claimed reporting_thread so proceed.
|
||||
CommonSanitizerReportMutex.Lock();
|
||||
return;
|
||||
}
|
||||
|
||||
if (expected_tid == current_tid) {
|
||||
if (expected == current) {
|
||||
// This is either asynch signal or nested error during error reporting.
|
||||
// Fail simple to avoid deadlocks in Report().
|
||||
|
||||
|
@ -320,7 +319,7 @@ ScopedErrorReportLock::ScopedErrorReportLock(u32 current_tid) {
|
|||
|
||||
ScopedErrorReportLock::~ScopedErrorReportLock() {
|
||||
CommonSanitizerReportMutex.Unlock();
|
||||
atomic_store_relaxed(&reporting_thread_tid, kUnclaimedTid);
|
||||
atomic_store_relaxed(&reporting_thread, 0);
|
||||
}
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
|
Loading…
Reference in New Issue