From 6610b99cb555abf493ba748c9b96126f10ee5790 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. llvm-svn: 210603 --- llvm/lib/Support/Threading.cpp | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'llvm/lib/Support/Threading.cpp') 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 -- cgit v1.2.3