ManagedStatic.cpp revision 4ee451de366474b9c228b4e5fa573795a715216d
1771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//===-- ManagedStatic.cpp - Static Global wrapper -------------------------===//
2771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//
3771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//                     The LLVM Compiler Infrastructure
4771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//
8771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//===----------------------------------------------------------------------===//
9771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//
10771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner// This file implements the ManagedStatic class and llvm_shutdown().
11771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//
12771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner//===----------------------------------------------------------------------===//
13771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
14771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner#include "llvm/Support/ManagedStatic.h"
15771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner#include <cassert>
16771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattnerusing namespace llvm;
17771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
18771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattnerstatic const ManagedStaticBase *StaticList = 0;
19771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
20771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattnervoid ManagedStaticBase::RegisterManagedStatic(void *ObjPtr,
21771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner                                              void (*Deleter)(void*)) const {
22771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  assert(Ptr == 0 && DeleterFn == 0 && Next == 0 &&
23771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner         "Partially init static?");
24771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  Ptr = ObjPtr;
25771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  DeleterFn = Deleter;
26771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
27771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  // Add to list of managed statics.
28771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  Next = StaticList;
29771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  StaticList = this;
30771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner}
31771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
32771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattnervoid ManagedStaticBase::destroy() const {
33d283566319a5bec8bfa2223580d92c86e01af13bChris Lattner  assert(DeleterFn && "ManagedStatic not initialized correctly!");
34771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  assert(StaticList == this &&
35771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner         "Not destroyed in reverse order of construction?");
36771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  // Unlink from list.
37771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  StaticList = Next;
38771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  Next = 0;
39771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
40771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  // Destroy memory.
41771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  DeleterFn(Ptr);
42771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
43771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  // Cleanup.
44771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  Ptr = 0;
45771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  DeleterFn = 0;
46771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner}
47771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
48771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
49151880b020e33e12a0286612ec450051bd16f8e8Chris Lattnervoid llvm::llvm_shutdown() {
50771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  while (StaticList)
51771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner    StaticList->destroy();
52771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner}
53771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
54