diff options
Diffstat (limited to 'llvm/lib/Support')
| -rw-r--r-- | llvm/lib/Support/ManagedStatic.cpp | 53 | 
1 files changed, 45 insertions, 8 deletions
| diff --git a/llvm/lib/Support/ManagedStatic.cpp b/llvm/lib/Support/ManagedStatic.cpp index c365e013c6f..056b6c06c1e 100644 --- a/llvm/lib/Support/ManagedStatic.cpp +++ b/llvm/lib/Support/ManagedStatic.cpp @@ -12,21 +12,44 @@  //===----------------------------------------------------------------------===//  #include "llvm/Support/ManagedStatic.h" +#include "llvm/Config/config.h" +#include "llvm/System/Atomic.h" +#include "llvm/System/Mutex.h"  #include <cassert>  using namespace llvm;  static const ManagedStaticBase *StaticList = 0; -void ManagedStaticBase::RegisterManagedStatic(void *ObjPtr, +static sys::Mutex* ManagedStaticMutex = 0; + +void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),                                                void (*Deleter)(void*)) const { -  assert(Ptr == 0 && DeleterFn == 0 && Next == 0 && -         "Partially init static?"); -  Ptr = ObjPtr; -  DeleterFn = Deleter; +  if (ManagedStaticMutex) { +    ManagedStaticMutex->acquire(); + +    if (Ptr == 0) { +      void* tmp = Creator ? Creator() : 0; + +      sys::MemoryFence(); +      Ptr = tmp; +      DeleterFn = Deleter; +       +      // Add to list of managed statics. +      Next = StaticList; +      StaticList = this; +    } + +    ManagedStaticMutex->release(); +  } else { +    assert(Ptr == 0 && DeleterFn == 0 && Next == 0 && +	   "Partially initialized ManagedStatic!?"); +    Ptr = Creator ? Creator() : 0; +    DeleterFn = Deleter; -  // Add to list of managed statics. -  Next = StaticList; -  StaticList = this; +    // Add to list of managed statics. +    Next = StaticList; +    StaticList = this; +  }  }  void ManagedStaticBase::destroy() const { @@ -45,9 +68,23 @@ void ManagedStaticBase::destroy() const {    DeleterFn = 0;  } +void llvm::llvm_start_multithreaded() { +#if LLVM_MULTITHREADED +  assert(ManagedStaticMutex == 0 && "Multithreaded LLVM already initialized!"); +  ManagedStaticMutex = new sys::Mutex(true); +#else +  assert(0 && "LLVM built without multithreading support!"); +#endif +} +  /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.  void llvm::llvm_shutdown() {    while (StaticList)      StaticList->destroy(); + +  if (ManagedStaticMutex) { +    delete ManagedStaticMutex; +    ManagedStaticMutex = 0; +  }  } | 

