X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FManagedStatic.h;h=d8fbfeb8e20cee089f8985d1ff9aa70a2a4515ca;hb=a4d0ff9cd1fb3fe4c3a58d0747dc523f7d9e9e3f;hp=e65fb1b64648823d0983bbc7ff3d6d03c03d4a79;hpb=b4d7e35dde3ccbe0dc10bf13332ade9812586dd0;p=oota-llvm.git diff --git a/include/llvm/Support/ManagedStatic.h b/include/llvm/Support/ManagedStatic.h index e65fb1b6464..d8fbfeb8e20 100644 --- a/include/llvm/Support/ManagedStatic.h +++ b/include/llvm/Support/ManagedStatic.h @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Chris Lattner and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -14,15 +14,27 @@ #ifndef LLVM_SUPPORT_MANAGED_STATIC_H #define LLVM_SUPPORT_MANAGED_STATIC_H +#include "llvm/Support/Atomic.h" +#include "llvm/Support/Threading.h" +#include "llvm/Support/Valgrind.h" + namespace llvm { -/// object_deleter - Helper method for ManagedStatic. -/// +/// object_creator - Helper method for ManagedStatic. template -void object_deleter(void *Ptr) { - delete (C*)Ptr; +void* object_creator() { + return new C(); } +/// object_deleter - Helper method for ManagedStatic. +/// +template struct object_deleter { + static void call(void * Ptr) { delete (T*)Ptr; } +}; +template struct object_deleter { + static void call(void * Ptr) { delete[] (T*)Ptr; } +}; + /// ManagedStaticBase - Common base class for ManagedStatic instances. class ManagedStaticBase { protected: @@ -31,12 +43,12 @@ protected: 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; } - + /// isConstructed - Return true if this object has not been created yet. + bool isConstructed() const { return Ptr != nullptr; } + void destroy() const; }; @@ -48,49 +60,52 @@ public: template class ManagedStatic : public ManagedStaticBase { public: - + // Accessors. C &operator*() { - if (!Ptr) LazyInit(); + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter::call); + TsanHappensAfter(this); + return *static_cast(Ptr); } C *operator->() { - if (!Ptr) LazyInit(); + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter::call); + TsanHappensAfter(this); + return static_cast(Ptr); } const C &operator*() const { - if (!Ptr) LazyInit(); + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter::call); + TsanHappensAfter(this); + return *static_cast(Ptr); } const C *operator->() const { - if (!Ptr) LazyInit(); + void* tmp = Ptr; + if (llvm_is_multithreaded()) sys::MemoryFence(); + if (!tmp) RegisterManagedStatic(object_creator, object_deleter::call); + TsanHappensAfter(this); + return static_cast(Ptr); } - -public: - void LazyInit() const { - RegisterManagedStatic(new C(), object_deleter); - } }; -template -class ManagedCleanup : public ManagedStaticBase { -public: - void Register() { RegisterManagedStatic(0, CleanupFn); } -}; - - /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables. 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() { } ~llvm_shutdown_obj() { llvm_shutdown(); } }; - + } #endif