summaryrefslogtreecommitdiff
path: root/lib/Support
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2014-06-19 16:17:42 +0000
committerZachary Turner <zturner@google.com>2014-06-19 16:17:42 +0000
commit761f33167f2ae180dddcf48abcfcc3ead0c2d219 (patch)
tree0a1f726d67d862f9751d257a1490b5d4c9097784 /lib/Support
parent591f9ee07680fb678e4510c94ff65b0d0a48d224 (diff)
downloadllvm-761f33167f2ae180dddcf48abcfcc3ead0c2d219.tar.gz
llvm-761f33167f2ae180dddcf48abcfcc3ead0c2d219.tar.bz2
llvm-761f33167f2ae180dddcf48abcfcc3ead0c2d219.tar.xz
Kill the LLVM global lock.
This patch removes the LLVM global lock, and updates all existing users of the global lock to use their own mutex. None of the existing users of the global lock were protecting code that was mutually exclusive with any of the other users of the global lock, so its purpose was not being met. Reviewed by: rnk Differential Revision: http://reviews.llvm.org/D4142 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211277 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/ManagedStatic.cpp23
-rw-r--r--lib/Support/Threading.cpp12
-rw-r--r--lib/Support/Timer.cpp4
3 files changed, 22 insertions, 17 deletions
diff --git a/lib/Support/ManagedStatic.cpp b/lib/Support/ManagedStatic.cpp
index 6a1c2a545a..9d7e99f97f 100644
--- a/lib/Support/ManagedStatic.cpp
+++ b/lib/Support/ManagedStatic.cpp
@@ -15,15 +15,32 @@
#include "llvm/Config/config.h"
#include "llvm/Support/Atomic.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.
+static std::once_flag MutexInitializationFlag;
+static std::recursive_mutex* ManagedStaticMutex = nullptr;
+
+// Not all supported platforms (in particular VS2012) have thread-safe function
+// static initialization, so roll our own.
+static std::recursive_mutex& GetManagedStaticMutex() {
+ std::call_once(MutexInitializationFlag,
+ []() { ManagedStaticMutex = new std::recursive_mutex(); } );
+
+ return *ManagedStaticMutex;
+}
+
void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
void (*Deleter)(void*)) const {
assert(Creator);
if (llvm_is_multithreaded()) {
- llvm_acquire_global_lock();
+ std::lock_guard<std::recursive_mutex> Lock(GetManagedStaticMutex());
if (!Ptr) {
void* tmp = Creator();
@@ -43,8 +60,6 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
Next = StaticList;
StaticList = this;
}
-
- llvm_release_global_lock();
} else {
assert(!Ptr && !DeleterFn && !Next &&
"Partially initialized ManagedStatic!?");
@@ -75,6 +90,8 @@ void ManagedStaticBase::destroy() const {
/// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
void llvm::llvm_shutdown() {
+ std::lock_guard<std::recursive_mutex> Lock(GetManagedStaticMutex());
+
while (StaticList)
StaticList->destroy();
diff --git a/lib/Support/Threading.cpp b/lib/Support/Threading.cpp
index 1acfa79b11..2358dde0e6 100644
--- a/lib/Support/Threading.cpp
+++ b/lib/Support/Threading.cpp
@@ -21,13 +21,10 @@ using namespace llvm;
static bool multithreaded_mode = false;
-static sys::Mutex* global_lock = nullptr;
-
bool llvm::llvm_start_multithreaded() {
#if LLVM_ENABLE_THREADS != 0
assert(!multithreaded_mode && "Already multithreaded!");
multithreaded_mode = true;
- global_lock = new sys::Mutex(true);
// We fence here to ensure that all initialization is complete BEFORE we
// return from llvm_start_multithreaded().
@@ -47,7 +44,6 @@ void llvm::llvm_stop_multithreaded() {
sys::MemoryFence();
multithreaded_mode = false;
- delete global_lock;
#endif
}
@@ -55,14 +51,6 @@ bool llvm::llvm_is_multithreaded() {
return multithreaded_mode;
}
-void llvm::llvm_acquire_global_lock() {
- if (multithreaded_mode) global_lock->acquire();
-}
-
-void llvm::llvm_release_global_lock() {
- if (multithreaded_mode) global_lock->release();
-}
-
#if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
#include <pthread.h>
diff --git a/lib/Support/Timer.cpp b/lib/Support/Timer.cpp
index 61465ae5e8..210bda754e 100644
--- a/lib/Support/Timer.cpp
+++ b/lib/Support/Timer.cpp
@@ -19,6 +19,7 @@
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Mutex.h"
+#include "llvm/Support/MutexGuard.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -84,14 +85,13 @@ static TimerGroup *getDefaultTimerGroup() {
sys::MemoryFence();
if (tmp) return tmp;
- llvm_acquire_global_lock();
+ sys::SmartScopedLock<true> Lock(*TimerLock);
tmp = DefaultTimerGroup;
if (!tmp) {
tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
sys::MemoryFence();
DefaultTimerGroup = tmp;
}
- llvm_release_global_lock();
return tmp;
}