1
0
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:
Zachary Turner 2014-06-16 22:40:42 +00:00
parent 3ae7ddbd11
commit aa7770ba44
4 changed files with 23 additions and 10 deletions

View File

@ -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();

View File

@ -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();
}

View File

@ -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;

View File

@ -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");