summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_symbolizer.cc
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-10-30 17:05:37 +0000
committerAlexey Samsonov <samsonov@google.com>2013-10-30 17:05:37 +0000
commite00495aa0f3b114c7b764769d9450e5d2efb8e64 (patch)
treebbe0117940e41d2ce3428787dadee3d0f0db375f /lib/sanitizer_common/sanitizer_symbolizer.cc
parent1bb2229028dd78280d24c26b9efbe8476d966e05 (diff)
[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
Diffstat (limited to 'lib/sanitizer_common/sanitizer_symbolizer.cc')
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer.cc22
1 files changed, 11 insertions, 11 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