@@ -71,16 +71,16 @@ static void CheckUnwind() {
71
71
}
72
72
73
73
// -------------------------- Globals --------------------- {{{1
74
- static int asan_inited = 0 ;
75
- static int asan_init_is_running = 0 ;
74
+ static StaticSpinMutex asan_inited_mutex ;
75
+ static atomic_uint8_t asan_inited = { 0 } ;
76
76
77
- static void SetAsanInited () { asan_inited = 1 ; }
78
-
79
- static void SetAsanInitIsRunning (u32 val) { asan_init_is_running = val; }
80
-
81
- bool AsanInited () { return asan_inited == 1 ; }
77
+ static void SetAsanInited () {
78
+ atomic_store (&asan_inited, 1 , memory_order_release);
79
+ }
82
80
83
- static bool AsanInitIsRunning () { return asan_init_is_running == 1 ; }
81
+ bool AsanInited () {
82
+ return atomic_load (&asan_inited, memory_order_acquire) == 1 ;
83
+ }
84
84
85
85
bool replace_intrin_cached;
86
86
@@ -390,12 +390,10 @@ void PrintAddressSpaceLayout() {
390
390
kHighShadowBeg > kMidMemEnd );
391
391
}
392
392
393
- static void AsanInitInternal () {
393
+ static bool AsanInitInternal () {
394
394
if (LIKELY (AsanInited ()))
395
- return ;
395
+ return true ;
396
396
SanitizerToolName = " AddressSanitizer" ;
397
- CHECK (!AsanInitIsRunning () && " ASan init calls itself!" );
398
- SetAsanInitIsRunning (1 );
399
397
400
398
CacheBinaryName ();
401
399
@@ -408,9 +406,8 @@ static void AsanInitInternal() {
408
406
// Stop performing init at this point if we are being loaded via
409
407
// dlopen() and the platform supports it.
410
408
if (SANITIZER_SUPPORTS_INIT_FOR_DLOPEN && UNLIKELY (HandleDlopenInit ())) {
411
- SetAsanInitIsRunning (0 );
412
409
VReport (1 , " AddressSanitizer init is being performed for dlopen().\n " );
413
- return ;
410
+ return false ;
414
411
}
415
412
416
413
AsanCheckIncompatibleRT ();
@@ -471,7 +468,6 @@ static void AsanInitInternal() {
471
468
// should be set to 1 prior to initializing the threads.
472
469
replace_intrin_cached = flags ()->replace_intrin ;
473
470
SetAsanInited ();
474
- SetAsanInitIsRunning (0 );
475
471
476
472
if (flags ()->atexit )
477
473
Atexit (asan_atexit);
@@ -515,22 +511,27 @@ static void AsanInitInternal() {
515
511
VReport (1 , " AddressSanitizer Init done\n " );
516
512
517
513
WaitForDebugger (flags ()->sleep_after_init , " after init" );
514
+
515
+ return true ;
518
516
}
519
517
520
518
// Initialize as requested from some part of ASan runtime library (interceptors,
521
519
// allocator, etc).
522
520
void AsanInitFromRtl () {
523
- CHECK (!AsanInitIsRunning ());
524
- if (UNLIKELY (!AsanInited ()))
525
- AsanInitInternal ();
521
+ if (LIKELY (AsanInited ()))
522
+ return ;
523
+ SpinMutexLock lock (&asan_inited_mutex);
524
+ AsanInitInternal ();
526
525
}
527
526
528
527
bool TryAsanInitFromRtl () {
529
- if (UNLIKELY (AsanInitIsRunning ()))
528
+ if (LIKELY (AsanInited ()))
529
+ return true ;
530
+ if (!asan_inited_mutex.TryLock ())
530
531
return false ;
531
- if ( UNLIKELY (! AsanInited ()))
532
- AsanInitInternal ();
533
- return true ;
532
+ bool result = AsanInitInternal ();
533
+ asan_inited_mutex. Unlock ();
534
+ return result ;
534
535
}
535
536
536
537
#if ASAN_DYNAMIC
@@ -603,7 +604,7 @@ static void UnpoisonFakeStack() {
603
604
using namespace __asan ;
604
605
605
606
void NOINLINE __asan_handle_no_return () {
606
- if (AsanInitIsRunning ( ))
607
+ if (UNLIKELY (! AsanInited () ))
607
608
return ;
608
609
609
610
if (!PlatformUnpoisonStacks ())
@@ -633,7 +634,7 @@ void NOINLINE __asan_set_death_callback(void (*callback)(void)) {
633
634
// We use this call as a trigger to wake up ASan from deactivated state.
634
635
void __asan_init () {
635
636
AsanActivate ();
636
- AsanInitInternal ();
637
+ AsanInitFromRtl ();
637
638
}
638
639
639
640
void __asan_version_mismatch_check () {
0 commit comments