Changes in directory llvm/include/llvm/Support:
ManagedStatic.h added (r1.1) --- Log message: new helper class to provide more explicit management of static ctor/dtors. --- Diffs of the changes: (+79 -0) ManagedStatic.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 79 insertions(+) Index: llvm/include/llvm/Support/ManagedStatic.h diff -c /dev/null llvm/include/llvm/Support/ManagedStatic.h:1.1 *** /dev/null Wed Sep 27 19:32:05 2006 --- llvm/include/llvm/Support/ManagedStatic.h Wed Sep 27 19:31:55 2006 *************** *** 0 **** --- 1,79 ---- + //===-- llvm/Support/ManagedStatic.h - Static Global wrapper ----*- C++ -*-===// + // + // 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 defines the ManagedStatic class and the llvm_shutdown() function. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_SUPPORT_MANAGED_STATIC_H + #define LLVM_SUPPORT_MANAGED_STATIC_H + + namespace llvm { + + /// object_deleter - Helper method for ManagedStatic. + /// + template<class C> + void object_deleter(void *Ptr) { + delete (C*)Ptr; + } + + /// ManagedStaticBase - Common base class for ManagedStatic instances. + class ManagedStaticBase { + protected: + // 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; + public: + void destroy() const; + }; + + /// ManagedStatic - This transparently changes the behavior of global statics to + /// be lazily constructed on demand (good for reducing startup times of dynamic + /// libraries that link in LLVM components) and for making destruction be + /// explicit through the llvm_shutdown() function call. + /// + template<class C> + class ManagedStatic : public ManagedStaticBase { + public: + + // Accessors. + C &operator*() { + if (!Ptr) LazyInit(); + return *static_cast<C*>(Ptr); + } + C *operator->() { + if (!Ptr) LazyInit(); + return static_cast<C*>(Ptr); + } + const C &operator*() const { + if (!Ptr) LazyInit(); + return *static_cast<C*>(Ptr); + } + const C *operator->() const { + if (!Ptr) LazyInit(); + return static_cast<C*>(Ptr); + } + + public: + void LazyInit() const { + RegisterManagedStatic(new C(), object_deleter<C>); + } + }; + + + /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables. + void llvm_shutdown(); + + } + + #endif _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits