mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-04 06:26:28 +00:00
new helper class to provide more explicit management of static ctor/dtors.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30638 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
53
lib/Support/ManagedStatic.cpp
Normal file
53
lib/Support/ManagedStatic.cpp
Normal file
@@ -0,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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user