summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNAKAMURA Takumi <geek4civic@gmail.com>2014-06-24 13:36:31 +0000
committerNAKAMURA Takumi <geek4civic@gmail.com>2014-06-24 13:36:31 +0000
commitcdde33ebaad211e1ce0fc22b53bbccff8bb3c1a4 (patch)
tree95d91245366b3a7cc446072a43fd365ba07f7da1 /lib
parent90be077d09df2f577448105c6dfd6ef78c4e6b6f (diff)
downloadllvm-cdde33ebaad211e1ce0fc22b53bbccff8bb3c1a4.tar.gz
llvm-cdde33ebaad211e1ce0fc22b53bbccff8bb3c1a4.tar.bz2
llvm-cdde33ebaad211e1ce0fc22b53bbccff8bb3c1a4.tar.xz
Revert r211287, "Remove support for LLVM runtime multi-threading."
libclang still requires it on cygming, lack of incomplete <mutex>. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211592 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/IR/Core.cpp3
-rw-r--r--lib/Support/Threading.cpp29
2 files changed, 28 insertions, 4 deletions
diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp
index 0cb781c2c6..2c49d5b949 100644
--- a/lib/IR/Core.cpp
+++ b/lib/IR/Core.cpp
@@ -2708,10 +2708,11 @@ void LLVMDisposePassManager(LLVMPassManagerRef PM) {
/*===-- Threading ------------------------------------------------------===*/
LLVMBool LLVMStartMultithreaded() {
- return LLVMIsMultithreaded();
+ return llvm_start_multithreaded();
}
void LLVMStopMultithreaded() {
+ llvm_stop_multithreaded();
}
LLVMBool LLVMIsMultithreaded() {
diff --git a/lib/Support/Threading.cpp b/lib/Support/Threading.cpp
index ca7f3f64aa..2358dde0e6 100644
--- a/lib/Support/Threading.cpp
+++ b/lib/Support/Threading.cpp
@@ -7,8 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
-// This file defines helper functions for running LLVM in a multi-threaded
-// environment.
+// This file implements llvm_start_multithreaded() and friends.
//
//===----------------------------------------------------------------------===//
@@ -20,14 +19,38 @@
using namespace llvm;
-bool llvm::llvm_is_multithreaded() {
+static bool multithreaded_mode = false;
+
+bool llvm::llvm_start_multithreaded() {
#if LLVM_ENABLE_THREADS != 0
+ assert(!multithreaded_mode && "Already multithreaded!");
+ multithreaded_mode = 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;
+#endif
+}
+
+bool llvm::llvm_is_multithreaded() {
+ return multithreaded_mode;
+}
+
#if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
#include <pthread.h>