[compiler-rt] r193697 - [Sanitizer] Use SpinMutex for Symbolizer initialization (per dvyukov's suggestion)

Alexey Samsonov samsonov at google.com
Wed Oct 30 10:05:37 PDT 2013


Author: samsonov
Date: Wed Oct 30 12:05:37 2013
New Revision: 193697

URL: http://llvm.org/viewvc/llvm-project?rev=193697&view=rev
Log:
[Sanitizer] Use SpinMutex for Symbolizer initialization (per dvyukov's suggestion)

Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc?rev=193697&r1=193696&r2=193697&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.cc Wed Oct 30 12:05:37 2013
@@ -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

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h?rev=193697&r1=193696&r2=193697&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h Wed Oct 30 12:05:37 2013
@@ -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_;

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc?rev=193697&r1=193696&r2=193697&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc Wed Oct 30 12:05:37 2013
@@ -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(c
   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





More information about the llvm-commits mailing list