[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