From e00495aa0f3b114c7b764769d9450e5d2efb8e64 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Wed, 30 Oct 2013 17:05:37 +0000 Subject: [Sanitizer] Use SpinMutex for Symbolizer initialization (per dvyukov's suggestion) git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@193697 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/sanitizer_common/sanitizer_symbolizer.cc | 22 +++++++++++----------- lib/sanitizer_common/sanitizer_symbolizer.h | 3 ++- .../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 ea74420f..6bec459b 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( - 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(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 ea2fc6a6..fb9473f3 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 a7a47d4a..b431e51e 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(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(sym); + SpinMutexLock l(&init_mu_); + if (symbolizer_ == 0) + return CreateAndStore(0); + return symbolizer_; } } // namespace __sanitizer -- cgit v1.2.3