diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer.cc | 22 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer.h | 3 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc | 21 |
3 files changed, 19 insertions, 27 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer.cc b/lib/sanitizer_common/sanitizer_symbolizer.cc index ea74420f3..6bec459b7 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer.cc @@ -18,26 +18,26 @@ namespace __sanitizer { -atomic_uintptr_t Symbolizer::symbolizer_; +Symbolizer *Symbolizer::symbolizer_; +StaticSpinMutex Symbolizer::init_mu_; LowLevelAllocator Symbolizer::symbolizer_allocator_; Symbolizer *Symbolizer::GetOrNull() { - return reinterpret_cast<Symbolizer *>( - atomic_load(&symbolizer_, memory_order_acquire)); + SpinMutexLock l(&init_mu_); + return symbolizer_; } Symbolizer *Symbolizer::Get() { - Symbolizer *sym = GetOrNull(); - CHECK(sym); - return sym; + SpinMutexLock l(&init_mu_); + RAW_CHECK_MSG(symbolizer_ != 0, "Using uninitialized symbolizer!"); + return symbolizer_; } Symbolizer *Symbolizer::Disable() { - CHECK_EQ(0, atomic_load(&symbolizer_, memory_order_acquire)); - Symbolizer *dummy_sym = new(symbolizer_allocator_) Symbolizer; - atomic_store(&symbolizer_, reinterpret_cast<uptr>(dummy_sym), - memory_order_release); - return dummy_sym; + CHECK_EQ(0, symbolizer_); + // Initialize a dummy symbolizer. + symbolizer_ = new(symbolizer_allocator_) Symbolizer; + return symbolizer_; } } // namespace __sanitizer diff --git a/lib/sanitizer_common/sanitizer_symbolizer.h b/lib/sanitizer_common/sanitizer_symbolizer.h index ea2fc6a6b..fb9473f31 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer.h +++ b/lib/sanitizer_common/sanitizer_symbolizer.h @@ -118,7 +118,8 @@ class Symbolizer { /// already exists. Not thread safe. static Symbolizer *CreateAndStore(const char *path_to_external); - static atomic_uintptr_t symbolizer_; + static Symbolizer *symbolizer_; + static StaticSpinMutex init_mu_; protected: static LowLevelAllocator symbolizer_allocator_; diff --git a/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc b/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc index a7a47d4a4..b431e51e2 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc @@ -11,9 +11,7 @@ // run-time libraries. //===----------------------------------------------------------------------===// -#include "sanitizer_platform.h" #include "sanitizer_internal_defs.h" -#include "sanitizer_placement_new.h" #include "sanitizer_symbolizer.h" namespace __sanitizer { @@ -22,27 +20,20 @@ Symbolizer *Symbolizer::CreateAndStore(const char *path_to_external) { Symbolizer *platform_symbolizer = PlatformInit(path_to_external); if (!platform_symbolizer) return Disable(); - atomic_store(&symbolizer_, reinterpret_cast<uptr>(platform_symbolizer), - memory_order_release); + symbolizer_ = platform_symbolizer; return platform_symbolizer; } Symbolizer *Symbolizer::Init(const char *path_to_external) { - CHECK_EQ(0, atomic_load(&symbolizer_, memory_order_acquire)); + CHECK_EQ(0, symbolizer_); return CreateAndStore(path_to_external); } Symbolizer *Symbolizer::GetOrInit() { - static StaticSpinMutex init_mu; - - uptr sym = atomic_load(&symbolizer_, memory_order_acquire); - if (!sym) { - SpinMutexLock l(&init_mu); - sym = atomic_load(&symbolizer_, memory_order_relaxed); - if (!sym) return CreateAndStore(0); - } - - return reinterpret_cast<Symbolizer *>(sym); + SpinMutexLock l(&init_mu_); + if (symbolizer_ == 0) + return CreateAndStore(0); + return symbolizer_; } } // namespace __sanitizer |