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