aboutsummaryrefslogtreecommitdiff
path: root/lib/Support/ManagedStatic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Support/ManagedStatic.cpp')
-rw-r--r--lib/Support/ManagedStatic.cpp53
1 files changed, 45 insertions, 8 deletions
diff --git a/lib/Support/ManagedStatic.cpp b/lib/Support/ManagedStatic.cpp
index c365e013c6..056b6c06c1 100644
--- a/lib/Support/ManagedStatic.cpp
+++ b/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;
+ }
}