[llvm-commits] CVS: llvm/lib/Support/ManagedStatic.cpp

Chris Lattner sabre at nondot.org
Wed Sep 27 17:32:11 PDT 2006



Changes in directory llvm/lib/Support:

ManagedStatic.cpp added (r1.1)
---
Log message:

new helper class to provide more explicit management of static ctor/dtors.


---
Diffs of the changes:  (+53 -0)

 ManagedStatic.cpp |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+)


Index: llvm/lib/Support/ManagedStatic.cpp
diff -c /dev/null llvm/lib/Support/ManagedStatic.cpp:1.1
*** /dev/null	Wed Sep 27 19:32:05 2006
--- llvm/lib/Support/ManagedStatic.cpp	Wed Sep 27 19:31:55 2006
***************
*** 0 ****
--- 1,53 ----
+ //===-- ManagedStatic.cpp - Static Global wrapper -------------------------===//
+ //
+ //                     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 implements the ManagedStatic class and llvm_shutdown().
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #include "llvm/Support/ManagedStatic.h"
+ #include <cassert>
+ using namespace llvm;
+ 
+ static const ManagedStaticBase *StaticList = 0;
+ 
+ void ManagedStaticBase::RegisterManagedStatic(void *ObjPtr,
+                                               void (*Deleter)(void*)) const {
+   assert(Ptr == 0 && DeleterFn == 0 && Next == 0 &&
+          "Partially init static?");
+   Ptr = ObjPtr;
+   DeleterFn = Deleter;
+   
+   // Add to list of managed statics.
+   Next = StaticList;
+   StaticList = this;
+ }
+ 
+ void ManagedStaticBase::destroy() const {
+   assert(Ptr && DeleterFn && "ManagedStatic not initialized correctly!");
+   assert(StaticList == this &&
+          "Not destroyed in reverse order of construction?");
+   // Unlink from list.
+   StaticList = Next;
+   Next = 0;
+ 
+   // Destroy memory.
+   DeleterFn(Ptr);
+   
+   // Cleanup.
+   Ptr = 0;
+   DeleterFn = 0;
+ }
+ 
+ /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
+ void llvm_shutdown() {
+   while (StaticList)
+     StaticList->destroy();
+ }
+ 






More information about the llvm-commits mailing list