1 //===-- llvm/Support/ManagedStatic.h - Static Global wrapper ----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the ManagedStatic class and the llvm_shutdown() function.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_SUPPORT_MANAGED_STATIC_H
15 #define LLVM_SUPPORT_MANAGED_STATIC_H
17 #include "llvm/System/Atomic.h"
21 /// object_deleter - Helper method for ManagedStatic.
24 void object_deleter(void *Ptr) {
28 /// ManagedStaticBase - Common base class for ManagedStatic instances.
29 class ManagedStaticBase {
31 mutable sys::cas_flag InitFlag;
33 // This should only be used as a static variable, which guarantees that this
34 // will be zero initialized.
36 mutable void (*DeleterFn)(void*);
37 mutable const ManagedStaticBase *Next;
39 void RegisterManagedStatic(void *ObjPtr, void (*deleter)(void*)) const;
41 /// isConstructed - Return true if this object has not been created yet.
42 bool isConstructed() const { return Ptr != 0; }
47 /// ManagedStatic - This transparently changes the behavior of global statics to
48 /// be lazily constructed on demand (good for reducing startup times of dynamic
49 /// libraries that link in LLVM components) and for making destruction be
50 /// explicit through the llvm_shutdown() function call.
53 class ManagedStatic : public ManagedStaticBase {
58 sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0);
63 } else if (OldFlag == 1)
64 while (OldFlag == 1) ;
66 return *static_cast<C*>(Ptr);
69 sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0);
74 } else if (OldFlag == 1)
75 while (OldFlag == 1) ;
77 return static_cast<C*>(Ptr);
79 const C &operator*() const {
80 sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0);
85 } else if (OldFlag == 1)
86 while (OldFlag == 1) ;
88 return *static_cast<C*>(Ptr);
90 const C *operator->() const {
91 sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0);
96 } else if (OldFlag == 1)
97 while (OldFlag == 1) ;
99 return static_cast<C*>(Ptr);
103 void LazyInit() const {
104 RegisterManagedStatic(new C(), object_deleter<C>);
108 template<void (*CleanupFn)(void*)>
109 class ManagedCleanup : public ManagedStaticBase {
111 void Register() { RegisterManagedStatic(0, CleanupFn); }
115 /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
116 void llvm_shutdown();
119 /// llvm_shutdown_obj - This is a simple helper class that calls
120 /// llvm_shutdown() when it is destroyed.
121 struct llvm_shutdown_obj {
122 llvm_shutdown_obj() {}
123 ~llvm_shutdown_obj() { llvm_shutdown(); }