X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FManagedStatic.h;h=4fc648319ad4757ba44d6cf6153defaccdd9cefe;hb=6f2c64d70aad5328a843a6f6a6547ada69ead33b;hp=e6384c72135b6b36cde9188db14af9884945aab3;hpb=5f00b0c5b63c30c7ad6134543318551902de5c93;p=oota-llvm.git diff --git a/include/llvm/Support/ManagedStatic.h b/include/llvm/Support/ManagedStatic.h index e6384c72135..4fc648319ad 100644 --- a/include/llvm/Support/ManagedStatic.h +++ b/include/llvm/Support/ManagedStatic.h @@ -15,9 +15,16 @@ #define LLVM_SUPPORT_MANAGED_STATIC_H #include "llvm/System/Atomic.h" +#include "llvm/System/Threading.h" namespace llvm { +/// object_creator - Helper method for ManagedStatic. +template +void* object_creator() { + return new C(); +} + /// object_deleter - Helper method for ManagedStatic. /// template @@ -28,15 +35,13 @@ void object_deleter(void *Ptr) { /// ManagedStaticBase - Common base class for ManagedStatic instances. class ManagedStaticBase { protected: - mutable sys::cas_flag InitFlag; - // This should only be used as a static variable, which guarantees that this // will be zero initialized. mutable void *Ptr; 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; } @@ -55,53 +60,32 @@ public: // Accessors. C &operator*() { - sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0); - if (OldFlag == 0) { - LazyInit(); - sys::MemoryFence(); - InitFlag = 2; - } else if (OldFlag == 1) - while (OldFlag == 1) ; - + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter); + return *static_cast(Ptr); } C *operator->() { - sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0); - if (OldFlag == 0) { - LazyInit(); - sys::MemoryFence(); - InitFlag = 2; - } else if (OldFlag == 1) - while (OldFlag == 1) ; - + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter); + return static_cast(Ptr); } const C &operator*() const { - sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0); - if (OldFlag == 0) { - LazyInit(); - sys::MemoryFence(); - InitFlag = 2; - } else if (OldFlag == 1) - while (OldFlag == 1) ; - + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter); + return *static_cast(Ptr); } const C *operator->() const { - sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0); - if (OldFlag == 0) { - LazyInit(); - sys::MemoryFence(); - InitFlag = 2; - } else if (OldFlag == 1) - while (OldFlag == 1) ; - - return static_cast(Ptr); - } + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter); -public: - void LazyInit() const { - RegisterManagedStatic(new C(), object_deleter); + return static_cast(Ptr); } }; @@ -111,7 +95,6 @@ public: void Register() { RegisterManagedStatic(0, CleanupFn); } }; - /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables. void llvm_shutdown(); @@ -119,7 +102,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(); } };