Skip to content

Commit

Permalink
Kill the LLVM global lock.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211069 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Zachary Turner committed Jun 16, 2014
1 parent 497b7bb commit 9020dc3
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 10 deletions.
3 changes: 0 additions & 3 deletions include/llvm/Support/Threading.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
23 changes: 22 additions & 1 deletion lib/Support/ManagedStatic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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();
}
5 changes: 0 additions & 5 deletions lib/Support/Threading.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion lib/Support/Timer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down

0 comments on commit 9020dc3

Please sign in to comment.