diff options
Diffstat (limited to 'lib/Support/ManagedStatic.cpp')
| -rw-r--r-- | lib/Support/ManagedStatic.cpp | 31 | 
1 files changed, 14 insertions, 17 deletions
| diff --git a/lib/Support/ManagedStatic.cpp b/lib/Support/ManagedStatic.cpp index 9868207b14ff2..7dd31315f90da 100644 --- a/lib/Support/ManagedStatic.cpp +++ b/lib/Support/ManagedStatic.cpp @@ -13,20 +13,25 @@  #include "llvm/Support/ManagedStatic.h"  #include "llvm/Config/config.h" -#include "llvm/Support/Atomic.h" -#include "llvm/Support/Compiler.h"  #include "llvm/Support/Mutex.h"  #include "llvm/Support/MutexGuard.h" +#include "llvm/Support/Threading.h"  #include <cassert>  using namespace llvm;  static const ManagedStaticBase *StaticList = nullptr; +static sys::Mutex *ManagedStaticMutex = nullptr; +LLVM_DEFINE_ONCE_FLAG(mutex_init_flag); -static sys::Mutex& getManagedStaticMutex() { +static void initializeMutex() { +  ManagedStaticMutex = new sys::Mutex(); +} + +static sys::Mutex* getManagedStaticMutex() {    // We need to use a function local static here, since this can get called    // during a static constructor and we need to guarantee that it's initialized    // correctly. -  static sys::Mutex ManagedStaticMutex; +  llvm::call_once(mutex_init_flag, initializeMutex);    return ManagedStaticMutex;  } @@ -34,20 +39,12 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),                                                void (*Deleter)(void*)) const {    assert(Creator);    if (llvm_is_multithreaded()) { -    MutexGuard Lock(getManagedStaticMutex()); - -    if (!Ptr) { -      void* tmp = Creator(); +    MutexGuard Lock(*getManagedStaticMutex()); -      TsanHappensBefore(this); -      sys::MemoryFence(); +    if (!Ptr.load(std::memory_order_relaxed)) { +      void *Tmp = Creator(); -      // This write is racy against the first read in the ManagedStatic -      // accessors. The race is benign because it does a second read after a -      // memory fence, at which point it isn't possible to get a partial value. -      TsanIgnoreWritesBegin(); -      Ptr = tmp; -      TsanIgnoreWritesEnd(); +      Ptr.store(Tmp, std::memory_order_release);        DeleterFn = Deleter;        // Add to list of managed statics. @@ -84,7 +81,7 @@ void ManagedStaticBase::destroy() const {  /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.  void llvm::llvm_shutdown() { -  MutexGuard Lock(getManagedStaticMutex()); +  MutexGuard Lock(*getManagedStaticMutex());    while (StaticList)      StaticList->destroy(); | 
