blob: 4e655a0f9eec461b9a41c8f4c72104859275d6ac [file] [log] [blame]
Chris Lattner771cbf32006-09-28 00:31:55 +00001//===-- ManagedStatic.cpp - Static Global wrapper -------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner771cbf32006-09-28 00:31:55 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the ManagedStatic class and llvm_shutdown().
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Support/ManagedStatic.h"
Owen Andersonb4d97b72009-05-20 00:39:20 +000015#include "llvm/Config/config.h"
16#include "llvm/System/Atomic.h"
Chris Lattner771cbf32006-09-28 00:31:55 +000017#include <cassert>
18using namespace llvm;
19
20static const ManagedStaticBase *StaticList = 0;
21
Owen Andersonb4d97b72009-05-20 00:39:20 +000022void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
Chris Lattner771cbf32006-09-28 00:31:55 +000023 void (*Deleter)(void*)) const {
Owen Anderson4c7ac182009-06-16 17:33:51 +000024 if (llvm_is_multithreaded()) {
25 llvm_acquire_global_lock();
Owen Andersonb4d97b72009-05-20 00:39:20 +000026
27 if (Ptr == 0) {
28 void* tmp = Creator ? Creator() : 0;
29
30 sys::MemoryFence();
31 Ptr = tmp;
32 DeleterFn = Deleter;
33
34 // Add to list of managed statics.
35 Next = StaticList;
36 StaticList = this;
37 }
38
Owen Anderson4c7ac182009-06-16 17:33:51 +000039 llvm_release_global_lock();
Owen Andersonb4d97b72009-05-20 00:39:20 +000040 } else {
41 assert(Ptr == 0 && DeleterFn == 0 && Next == 0 &&
Bill Wendling51b16f42009-05-30 01:09:53 +000042 "Partially initialized ManagedStatic!?");
Owen Andersonb4d97b72009-05-20 00:39:20 +000043 Ptr = Creator ? Creator() : 0;
44 DeleterFn = Deleter;
Chris Lattner771cbf32006-09-28 00:31:55 +000045
Owen Andersonb4d97b72009-05-20 00:39:20 +000046 // Add to list of managed statics.
47 Next = StaticList;
48 StaticList = this;
49 }
Chris Lattner771cbf32006-09-28 00:31:55 +000050}
51
52void ManagedStaticBase::destroy() const {
Chris Lattnerd2835662007-02-20 06:18:57 +000053 assert(DeleterFn && "ManagedStatic not initialized correctly!");
Chris Lattner771cbf32006-09-28 00:31:55 +000054 assert(StaticList == this &&
55 "Not destroyed in reverse order of construction?");
56 // Unlink from list.
57 StaticList = Next;
58 Next = 0;
59
60 // Destroy memory.
61 DeleterFn(Ptr);
62
63 // Cleanup.
64 Ptr = 0;
65 DeleterFn = 0;
66}
67
68/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
Chris Lattner151880b2006-09-29 18:43:14 +000069void llvm::llvm_shutdown() {
Chris Lattner771cbf32006-09-28 00:31:55 +000070 while (StaticList)
71 StaticList->destroy();
Owen Andersonb4d97b72009-05-20 00:39:20 +000072
Owen Anderson4c7ac182009-06-16 17:33:51 +000073 if (llvm_is_multithreaded()) llvm_stop_multithreaded();
Chris Lattner771cbf32006-09-28 00:31:55 +000074}
75