diff options
author | Owen Anderson <resistor@mac.com> | 2009-05-20 00:39:20 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-05-20 00:39:20 +0000 |
commit | b4d97b78dfd0d14a788fa3cb876f67a9e666b99b (patch) | |
tree | e42e951916b19287fa971f1dc6b771fcb4104685 /include/llvm/Support/ManagedStatic.h | |
parent | 513fae2db51c7d22ec1253e89939d27732b21a5e (diff) |
Add llvm_start_multithreaded(), which starts up the LLVM internals in thread-safe mode. Provide double-check locking
initialization of ManagedStatic's when running in thread-safe mode.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72151 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support/ManagedStatic.h')
-rw-r--r-- | include/llvm/Support/ManagedStatic.h | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/include/llvm/Support/ManagedStatic.h b/include/llvm/Support/ManagedStatic.h index d0298e495d..7eecce3241 100644 --- a/include/llvm/Support/ManagedStatic.h +++ b/include/llvm/Support/ManagedStatic.h @@ -14,8 +14,16 @@ #ifndef LLVM_SUPPORT_MANAGED_STATIC_H #define LLVM_SUPPORT_MANAGED_STATIC_H +#include "llvm/System/Atomic.h" + namespace llvm { +/// object_creator - Helper method for ManagedStatic. +template<class C> +void* object_creator() { + return new C(); +} + /// object_deleter - Helper method for ManagedStatic. /// template<class C> @@ -32,7 +40,7 @@ protected: mutable void (*DeleterFn)(void*); mutable const ManagedStaticBase *Next; - void RegisterManagedStatic(void *ObjPtr, void (*deleter)(void*)) const; + void RegisterManagedStatic(void *(*creator)(), void (*deleter)(void*)) const; public: /// isConstructed - Return true if this object has not been created yet. bool isConstructed() const { return Ptr != 0; } @@ -51,25 +59,32 @@ public: // Accessors. C &operator*() { - if (!Ptr) LazyInit(); + void* tmp = Ptr; + sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>); + return *static_cast<C*>(Ptr); } C *operator->() { - if (!Ptr) LazyInit(); + void* tmp = Ptr; + sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>); + return static_cast<C*>(Ptr); } const C &operator*() const { - if (!Ptr) LazyInit(); + void* tmp = Ptr; + sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>); + return *static_cast<C*>(Ptr); } const C *operator->() const { - if (!Ptr) LazyInit(); - return static_cast<C*>(Ptr); - } + void* tmp = Ptr; + sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>); -public: - void LazyInit() const { - RegisterManagedStatic(new C(), object_deleter<C>); + return static_cast<C*>(Ptr); } }; @@ -80,6 +95,10 @@ public: }; +/// llvm_start_multithreaded - Allocate and initialize structures needed to +/// make LLVM safe for multithreading. +void llvm_start_multithreaded(); + /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables. void llvm_shutdown(); @@ -87,7 +106,10 @@ void llvm_shutdown(); /// llvm_shutdown_obj - This is a simple helper class that calls /// llvm_shutdown() when it is destroyed. struct llvm_shutdown_obj { - llvm_shutdown_obj() {} + llvm_shutdown_obj() { } + explicit llvm_shutdown_obj(bool multithreaded) { + if (multithreaded) llvm_start_multithreaded(); + } ~llvm_shutdown_obj() { llvm_shutdown(); } }; |