summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer.cc22
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer.h3
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc21
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<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 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<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