diff options
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r-- | llvm/lib/Support/ErrorHandling.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/Support/ManagedStatic.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/Support/Threading.cpp | 41 | ||||
-rw-r--r-- | llvm/lib/Support/Timer.cpp | 3 |
4 files changed, 44 insertions, 14 deletions
diff --git a/llvm/lib/Support/ErrorHandling.cpp b/llvm/lib/Support/ErrorHandling.cpp index b9e4eabe926..342c4f05cc9 100644 --- a/llvm/lib/Support/ErrorHandling.cpp +++ b/llvm/lib/Support/ErrorHandling.cpp @@ -23,7 +23,6 @@ #include "llvm/Support/raw_ostream.h" #include <cassert> #include <cstdlib> -#include <mutex> #if defined(HAVE_UNISTD_H) # include <unistd.h> @@ -38,18 +37,16 @@ using namespace llvm; static fatal_error_handler_t ErrorHandler = nullptr; static void *ErrorHandlerUserData = nullptr; -static llvm::recursive_mutex ErrorHandlerMutex; - void llvm::install_fatal_error_handler(fatal_error_handler_t handler, void *user_data) { - std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex); + assert(!llvm_is_multithreaded() && + "Cannot register error handlers after starting multithreaded mode!\n"); assert(!ErrorHandler && "Error handler already registered!\n"); ErrorHandler = handler; ErrorHandlerUserData = user_data; } void llvm::remove_fatal_error_handler() { - std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex); ErrorHandler = nullptr; } @@ -66,7 +63,6 @@ void llvm::report_fatal_error(StringRef Reason, bool GenCrashDiag) { } void llvm::report_fatal_error(const Twine &Reason, bool GenCrashDiag) { - std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex); if (ErrorHandler) { ErrorHandler(ErrorHandlerUserData, Reason.str(), GenCrashDiag); } else { diff --git a/llvm/lib/Support/ManagedStatic.cpp b/llvm/lib/Support/ManagedStatic.cpp index 74884d93304..6a1c2a545a8 100644 --- a/llvm/lib/Support/ManagedStatic.cpp +++ b/llvm/lib/Support/ManagedStatic.cpp @@ -15,7 +15,6 @@ #include "llvm/Config/config.h" #include "llvm/Support/Atomic.h" #include <cassert> -#include <mutex> using namespace llvm; static const ManagedStaticBase *StaticList = nullptr; @@ -24,7 +23,7 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(), void (*Deleter)(void*)) const { assert(Creator); if (llvm_is_multithreaded()) { - std::lock_guard<llvm::recursive_mutex> Lock(llvm_get_global_lock()); + llvm_acquire_global_lock(); if (!Ptr) { void* tmp = Creator(); @@ -45,6 +44,7 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(), StaticList = this; } + llvm_release_global_lock(); } else { assert(!Ptr && !DeleterFn && !Next && "Partially initialized ManagedStatic!?"); @@ -77,4 +77,6 @@ void ManagedStaticBase::destroy() const { void llvm::llvm_shutdown() { while (StaticList) StaticList->destroy(); + + if (llvm_is_multithreaded()) llvm_stop_multithreaded(); } diff --git a/llvm/lib/Support/Threading.cpp b/llvm/lib/Support/Threading.cpp index c9f0f2c2e5a..1acfa79b11d 100644 --- a/llvm/lib/Support/Threading.cpp +++ b/llvm/lib/Support/Threading.cpp @@ -19,19 +19,50 @@ using namespace llvm; -llvm::recursive_mutex& llvm::llvm_get_global_lock() { - static llvm::recursive_mutex global_lock; - return global_lock; -} +static bool multithreaded_mode = false; -bool llvm::llvm_is_multithreaded() { +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(). + sys::MemoryFence(); return true; #else return false; #endif } +void llvm::llvm_stop_multithreaded() { +#if LLVM_ENABLE_THREADS != 0 + assert(multithreaded_mode && "Not currently multithreaded!"); + + // We fence here to insure that all threaded operations are complete BEFORE we + // return from llvm_stop_multithreaded(). + sys::MemoryFence(); + + multithreaded_mode = false; + delete global_lock; +#endif +} + +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/llvm/lib/Support/Timer.cpp b/llvm/lib/Support/Timer.cpp index cdab02b2fb7..61465ae5e8b 100644 --- a/llvm/lib/Support/Timer.cpp +++ b/llvm/lib/Support/Timer.cpp @@ -84,13 +84,14 @@ static TimerGroup *getDefaultTimerGroup() { sys::MemoryFence(); if (tmp) return tmp; - std::lock_guard<llvm::recursive_mutex> Lock(llvm::llvm_get_global_lock()); + llvm_acquire_global_lock(); tmp = DefaultTimerGroup; if (!tmp) { tmp = new TimerGroup("Miscellaneous Ungrouped Timers"); sys::MemoryFence(); DefaultTimerGroup = tmp; } + llvm_release_global_lock(); return tmp; } |