From 63ce00b72f2420852a9d5dcb5b025d3320b7b989 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Tue, 10 Jun 2014 23:15:43 +0000 Subject: Revert "Remove support for runtime multi-threading." This reverts revision r210600. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210603 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/ErrorHandling.cpp | 8 ++------ lib/Support/ManagedStatic.cpp | 6 ++++-- lib/Support/Threading.cpp | 41 ++++++++++++++++++++++++++++++++++++----- lib/Support/Timer.cpp | 3 ++- 4 files changed, 44 insertions(+), 14 deletions(-) (limited to 'lib/Support') diff --git a/lib/Support/ErrorHandling.cpp b/lib/Support/ErrorHandling.cpp index b9e4eabe92..342c4f05cc 100644 --- a/lib/Support/ErrorHandling.cpp +++ b/lib/Support/ErrorHandling.cpp @@ -23,7 +23,6 @@ #include "llvm/Support/raw_ostream.h" #include #include -#include #if defined(HAVE_UNISTD_H) # include @@ -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 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 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 Lock(ErrorHandlerMutex); if (ErrorHandler) { ErrorHandler(ErrorHandlerUserData, Reason.str(), GenCrashDiag); } else { diff --git a/lib/Support/ManagedStatic.cpp b/lib/Support/ManagedStatic.cpp index 74884d9330..6a1c2a545a 100644 --- a/lib/Support/ManagedStatic.cpp +++ b/lib/Support/ManagedStatic.cpp @@ -15,7 +15,6 @@ #include "llvm/Config/config.h" #include "llvm/Support/Atomic.h" #include -#include 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 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/lib/Support/Threading.cpp b/lib/Support/Threading.cpp index c9f0f2c2e5..1acfa79b11 100644 --- a/lib/Support/Threading.cpp +++ b/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 diff --git a/lib/Support/Timer.cpp b/lib/Support/Timer.cpp index cdab02b2fb..61465ae5e8 100644 --- a/lib/Support/Timer.cpp +++ b/lib/Support/Timer.cpp @@ -84,13 +84,14 @@ static TimerGroup *getDefaultTimerGroup() { sys::MemoryFence(); if (tmp) return tmp; - std::lock_guard 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; } -- cgit v1.2.3