ManagedStatic.cpp revision 1f6efa3996dd1929fbc129203ce5009b620e6969
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"
15b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson#include "llvm/Config/config.h"
161f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Atomic.h"
17771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner#include <cassert>
18771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattnerusing namespace llvm;
19771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
20771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattnerstatic const ManagedStaticBase *StaticList = 0;
21771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
22b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Andersonvoid ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
23771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner                                              void (*Deleter)(void*)) const {
244c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson  if (llvm_is_multithreaded()) {
254c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson    llvm_acquire_global_lock();
26b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson
27b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    if (Ptr == 0) {
28b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson      void* tmp = Creator ? Creator() : 0;
29b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson
30b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson      sys::MemoryFence();
31b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson      Ptr = tmp;
32b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson      DeleterFn = Deleter;
33b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson
34b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson      // Add to list of managed statics.
35b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson      Next = StaticList;
36b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson      StaticList = this;
37b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    }
38b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson
394c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson    llvm_release_global_lock();
40b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson  } else {
41b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    assert(Ptr == 0 && DeleterFn == 0 && Next == 0 &&
4251b16f473759c1546acbf308a5d3f3e7bf3ea23cBill Wendling           "Partially initialized ManagedStatic!?");
43b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    Ptr = Creator ? Creator() : 0;
44b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    DeleterFn = Deleter;
45771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
46b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    // Add to list of managed statics.
47b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    Next = StaticList;
48b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson    StaticList = this;
49b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson  }
50771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner}
51771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
52771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattnervoid ManagedStaticBase::destroy() const {
53d283566319a5bec8bfa2223580d92c86e01af13bChris Lattner  assert(DeleterFn && "ManagedStatic not initialized correctly!");
54771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  assert(StaticList == this &&
55771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner         "Not destroyed in reverse order of construction?");
56771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  // Unlink from list.
57771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  StaticList = Next;
58771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  Next = 0;
59771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
60771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  // Destroy memory.
61771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  DeleterFn(Ptr);
62771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
63771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  // Cleanup.
64771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  Ptr = 0;
65771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  DeleterFn = 0;
66771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner}
67771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
68771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
69151880b020e33e12a0286612ec450051bd16f8e8Chris Lattnervoid llvm::llvm_shutdown() {
70771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner  while (StaticList)
71771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner    StaticList->destroy();
72b4d97b78dfd0d14a788fa3cb876f67a9e666b99bOwen Anderson
734c7ac18fc9e9af51ea6362871589c13263526d7aOwen Anderson  if (llvm_is_multithreaded()) llvm_stop_multithreaded();
74771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner}
75771cbf30bc1ff025316d1a80aeb5102375c1598eChris Lattner
76