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