aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/Threading.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-06-16 17:33:51 +0000
committerOwen Anderson <resistor@mac.com>2009-06-16 17:33:51 +0000
commit4cb4b6191a17b109c6aefe64d111f29aef5d1d15 (patch)
tree2ebe8321b6dc976e315ae58eb9033b09278c0238 /llvm/lib/Support/Threading.cpp
parent651a221cc2bf1d38ff489d76ad70cbb3c2727426 (diff)
downloadllvm-4cb4b6191a17b109c6aefe64d111f29aef5d1d15.zip
llvm-4cb4b6191a17b109c6aefe64d111f29aef5d1d15.tar.gz
llvm-4cb4b6191a17b109c6aefe64d111f29aef5d1d15.tar.bz2
Split the thread-related APIs out into their own file, and add a few more
calls for convenience. llvm-svn: 73512
Diffstat (limited to 'llvm/lib/Support/Threading.cpp')
-rw-r--r--llvm/lib/Support/Threading.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/llvm/lib/Support/Threading.cpp b/llvm/lib/Support/Threading.cpp
new file mode 100644
index 0000000..a587648
--- /dev/null
+++ b/llvm/lib/Support/Threading.cpp
@@ -0,0 +1,63 @@
+//===-- llvm/Support/Threading.cpp- Control multithreading mode --*- C++ -*-==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements llvm_start_multithreaded() and friends.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/Threading.h"
+#include "llvm/System/Atomic.h"
+#include "llvm/System/Mutex.h"
+#include <cassert>
+
+using namespace llvm;
+
+static bool multithreaded_mode = false;
+
+static sys::Mutex* global_lock = 0;
+
+bool llvm::llvm_start_multithreaded() {
+#ifdef LLVM_MULTITHREADED
+ 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() {
+#ifdef LLVM_MULTITHREADED
+ 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();
+} \ No newline at end of file