blob: a3b2bcc66a9c6dc390c7239b34ede162499386b7 [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"
17#include "llvm/System/Mutex.h"
Chris Lattner771cbf32006-09-28 00:31:55 +000018#include <cassert>
19using namespace llvm;
20
21static const ManagedStaticBase *StaticList = 0;
22
Owen Andersonb4d97b72009-05-20 00:39:20 +000023static sys::Mutex* ManagedStaticMutex = 0;
24
25void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
Chris Lattner771cbf32006-09-28 00:31:55 +000026 void (*Deleter)(void*)) const {
Owen Andersonb4d97b72009-05-20 00:39:20 +000027 if (ManagedStaticMutex) {
28 ManagedStaticMutex->acquire();
29
30 if (Ptr == 0) {
31 void* tmp = Creator ? Creator() : 0;
32
33 sys::MemoryFence();
34 Ptr = tmp;
35 DeleterFn = Deleter;
36
37 // Add to list of managed statics.
38 Next = StaticList;
39 StaticList = this;
40 }
41
42 ManagedStaticMutex->release();
43 } else {
44 assert(Ptr == 0 && DeleterFn == 0 && Next == 0 &&
45 "Partially initialized ManagedStatic!?");
46 Ptr = Creator ? Creator() : 0;
47 DeleterFn = Deleter;
Chris Lattner771cbf32006-09-28 00:31:55 +000048
Owen Andersonb4d97b72009-05-20 00:39:20 +000049 // Add to list of managed statics.
50 Next = StaticList;
51 StaticList = this;
52 }
Chris Lattner771cbf32006-09-28 00:31:55 +000053}
54
55void ManagedStaticBase::destroy() const {
Chris Lattnerd2835662007-02-20 06:18:57 +000056 assert(DeleterFn && "ManagedStatic not initialized correctly!");
Chris Lattner771cbf32006-09-28 00:31:55 +000057 assert(StaticList == this &&
58 "Not destroyed in reverse order of construction?");
59 // Unlink from list.
60 StaticList = Next;
61 Next = 0;
62
63 // Destroy memory.
64 DeleterFn(Ptr);
65
66 // Cleanup.
67 Ptr = 0;
68 DeleterFn = 0;
69}
70
Owen Anderson6afe2fa2009-05-20 21:03:06 +000071bool llvm::llvm_start_multithreaded() {
Owen Andersonb4d97b72009-05-20 00:39:20 +000072#if LLVM_MULTITHREADED
73 assert(ManagedStaticMutex == 0 && "Multithreaded LLVM already initialized!");
74 ManagedStaticMutex = new sys::Mutex(true);
Owen Anderson6afe2fa2009-05-20 21:03:06 +000075 return true;
Owen Andersonb4d97b72009-05-20 00:39:20 +000076#else
Owen Anderson6afe2fa2009-05-20 21:03:06 +000077 return false;
Owen Andersonb4d97b72009-05-20 00:39:20 +000078#endif
79}
80
Chris Lattner771cbf32006-09-28 00:31:55 +000081/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
Chris Lattner151880b2006-09-29 18:43:14 +000082void llvm::llvm_shutdown() {
Chris Lattner771cbf32006-09-28 00:31:55 +000083 while (StaticList)
84 StaticList->destroy();
Owen Andersonb4d97b72009-05-20 00:39:20 +000085
86 if (ManagedStaticMutex) {
87 delete ManagedStaticMutex;
88 ManagedStaticMutex = 0;
89 }
Chris Lattner771cbf32006-09-28 00:31:55 +000090}
91