[llvm-commits] CVS: llvm/include/llvm/Support/ManagedStatic.h
Chris Lattner
sabre at nondot.org
Wed Sep 27 17:32:10 PDT 2006
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
More information about the llvm-commits
mailing list