[llvm-commits] CVS: llvm/include/llvm/Support/ManagedStatic.h

Reid Spencer rspencer at reidspencer.com
Wed Sep 27 18:21:49 PDT 2006


On Wed, 2006-09-27 at 19:32 -0500, Chris Lattner wrote:
> 
> 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.

Looks like an interesting approach to this problem. One question ..
below

> 
> 
> ---
> 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>);

This requires a default constructor for class "C". How would that work
for things like:

static PrimType TheVoidTy  ("void"  , Type::VoidTyID);

in Type.cpp ?

Reid.




More information about the llvm-commits mailing list