mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Kill the LLVM global lock.
llvm-svn: 211069
This commit is contained in:
parent
3ae7ddbd11
commit
aa7770ba44
@ -18,9 +18,6 @@
|
||||
#include "llvm/Support/Mutex.h"
|
||||
|
||||
namespace llvm {
|
||||
/// llvm_get_global_lock - returns the llvm global lock object.
|
||||
sys::Mutex &llvm_get_global_lock();
|
||||
|
||||
/// llvm_is_multithreaded - returns true if LLVM is compiled with support
|
||||
/// for multiple threads, and false otherwise.
|
||||
bool llvm_is_multithreaded();
|
||||
|
@ -16,16 +16,34 @@
|
||||
#include "llvm/Support/Atomic.h"
|
||||
#include "llvm/Support/MutexGuard.h"
|
||||
#include <cassert>
|
||||
#include <mutex>
|
||||
using namespace llvm;
|
||||
|
||||
static const ManagedStaticBase *StaticList = nullptr;
|
||||
|
||||
// ManagedStatics can get created during execution of static constructors. As a
|
||||
// result, we cannot use a global static std::mutex object for the lock since it
|
||||
// may not have been constructed. Instead, we do a call-once initialization of
|
||||
// a pointer to a mutex. This also means that we must not "initialize" the
|
||||
// mutex with nullptr, otherwise it might get reset to nullptr after being
|
||||
// initialized by std::call_once.
|
||||
static std::once_flag MutexInitializationFlag;
|
||||
static std::recursive_mutex *ManagedStaticMutex;
|
||||
|
||||
namespace {
|
||||
void InitializeManagedStaticMutex() {
|
||||
std::call_once(MutexInitializationFlag,
|
||||
[]() { ManagedStaticMutex = new std::recursive_mutex(); });
|
||||
}
|
||||
}
|
||||
|
||||
void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
|
||||
void (*Deleter)(void*)) const {
|
||||
assert(Creator);
|
||||
if (llvm_is_multithreaded()) {
|
||||
llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
|
||||
InitializeManagedStaticMutex();
|
||||
|
||||
std::lock_guard<std::recursive_mutex> Lock(*ManagedStaticMutex);
|
||||
if (!Ptr) {
|
||||
void* tmp = Creator();
|
||||
|
||||
@ -74,6 +92,9 @@ void ManagedStaticBase::destroy() const {
|
||||
|
||||
/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
|
||||
void llvm::llvm_shutdown() {
|
||||
InitializeManagedStaticMutex();
|
||||
std::lock_guard<std::recursive_mutex> Lock(*ManagedStaticMutex);
|
||||
|
||||
while (StaticList)
|
||||
StaticList->destroy();
|
||||
}
|
||||
|
@ -20,11 +20,6 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
sys::Mutex& llvm::llvm_get_global_lock() {
|
||||
static sys::Mutex global_lock;
|
||||
return global_lock;
|
||||
}
|
||||
|
||||
bool llvm::llvm_is_multithreaded() {
|
||||
#if LLVM_ENABLE_THREADS != 0
|
||||
return true;
|
||||
|
@ -84,7 +84,7 @@ static TimerGroup *getDefaultTimerGroup() {
|
||||
sys::MemoryFence();
|
||||
if (tmp) return tmp;
|
||||
|
||||
llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
|
||||
sys::SmartScopedLock<true> Lock(*TimerLock);
|
||||
tmp = DefaultTimerGroup;
|
||||
if (!tmp) {
|
||||
tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
|
||||
|
Loading…
Reference in New Issue
Block a user