Skip to content

Commit 0907552

Browse files
authored
[rtsan] Refactor initialization state to prevent hangs (#109830)
Move to tri state (Uninitialized, Initialized, Initializing) for our init state. We currently just have 2 (Uninitialized and Initialized).
1 parent 04b443e commit 0907552

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

compiler-rt/lib/rtsan/rtsan.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,25 @@
2222
using namespace __rtsan;
2323
using namespace __sanitizer;
2424

25+
namespace {
26+
enum class InitializationState : u8 {
27+
Uninitialized,
28+
Initializing,
29+
Initialized,
30+
};
31+
} // namespace
32+
2533
static StaticSpinMutex rtsan_inited_mutex;
2634
static atomic_uint8_t rtsan_initialized = {0};
2735

28-
static void SetInitialized() {
29-
atomic_store(&rtsan_initialized, 1, memory_order_release);
36+
static void SetInitializationState(InitializationState state) {
37+
atomic_store(&rtsan_initialized, static_cast<u8>(state),
38+
memory_order_release);
39+
}
40+
41+
static InitializationState GetInitializationState() {
42+
return static_cast<InitializationState>(
43+
atomic_load(&rtsan_initialized, memory_order_acquire));
3044
}
3145

3246
static auto PrintDiagnosticsAndDieAction(DiagnosticsInfo info) {
@@ -39,13 +53,14 @@ static auto PrintDiagnosticsAndDieAction(DiagnosticsInfo info) {
3953
extern "C" {
4054

4155
SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_init() {
42-
CHECK(!__rtsan_is_initialized());
56+
CHECK(GetInitializationState() == InitializationState::Uninitialized);
57+
SetInitializationState(InitializationState::Initializing);
4358

4459
SanitizerToolName = "RealtimeSanitizer";
4560
InitializeFlags();
4661
InitializeInterceptors();
4762

48-
SetInitialized();
63+
SetInitializationState(InitializationState::Initialized);
4964
}
5065

5166
SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_ensure_initialized() {
@@ -62,7 +77,7 @@ SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_ensure_initialized() {
6277
}
6378

6479
SANITIZER_INTERFACE_ATTRIBUTE bool __rtsan_is_initialized() {
65-
return atomic_load(&rtsan_initialized, memory_order_acquire) == 1;
80+
return GetInitializationState() == InitializationState::Initialized;
6681
}
6782

6883
SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_realtime_enter() {
@@ -83,6 +98,10 @@ SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_enable() {
8398

8499
SANITIZER_INTERFACE_ATTRIBUTE void
85100
__rtsan_notify_intercepted_call(const char *func_name) {
101+
// While initializing, we need all intercepted functions to behave normally
102+
if (GetInitializationState() == InitializationState::Initializing)
103+
return;
104+
86105
__rtsan_ensure_initialized();
87106
GET_CALLER_PC_BP;
88107
ExpectNotRealtime(

0 commit comments

Comments
 (0)