#define LLVM_SUPPORT_MUTEX_H
#include "llvm/Support/Compiler.h"
-#include "llvm/Support/Threading.h"
#include <cassert>
namespace llvm
{
+ // Forward declare.
+ bool llvm_is_multithreaded();
+
namespace sys
{
/// @brief Platform agnostic Mutex class.
#ifndef LLVM_SUPPORT_THREADING_H
#define LLVM_SUPPORT_THREADING_H
+#include "llvm/Support/Mutex.h"
+
namespace llvm {
+ /// llvm_get_global_lock - returns the llvm global lock object.
+ sys::Mutex& llvm_get_global_lock();
+
/// llvm_start_multithreaded - Allocate and initialize structures needed to
/// make LLVM safe for multithreading. The return value indicates whether
/// multithreaded initialization succeeded. LLVM will still be operational
/// mode or not.
bool llvm_is_multithreaded();
- /// acquire_global_lock - Acquire the global lock. This is a no-op if called
- /// before llvm_start_multithreaded().
- void llvm_acquire_global_lock();
-
- /// release_global_lock - Release the global lock. This is a no-op if called
- /// before llvm_start_multithreaded().
- void llvm_release_global_lock();
-
/// llvm_execute_on_thread - Execute the given \p UserFn on a separate
/// thread, passing it the provided \p UserData.
///
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Config/config.h"
#include "llvm/Support/Atomic.h"
+#include "llvm/Support/MutexGuard.h"
#include <cassert>
using namespace llvm;
void (*Deleter)(void*)) const {
assert(Creator);
if (llvm_is_multithreaded()) {
- llvm_acquire_global_lock();
+ llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
if (!Ptr) {
void* tmp = Creator();
Next = StaticList;
StaticList = this;
}
-
- llvm_release_global_lock();
} else {
assert(!Ptr && !DeleterFn && !Next &&
"Partially initialized ManagedStatic!?");
static bool multithreaded_mode = false;
-static sys::Mutex* global_lock = nullptr;
+sys::Mutex& llvm::llvm_get_global_lock() {
+ static sys::Mutex global_lock;
+ return global_lock;
+}
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();
multithreaded_mode = false;
- delete global_lock;
#endif
}
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>
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/Mutex.h"
+#include "llvm/support/MutexGuard.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
sys::MemoryFence();
if (tmp) return tmp;
- llvm_acquire_global_lock();
+ llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
tmp = DefaultTimerGroup;
if (!tmp) {
tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
sys::MemoryFence();
DefaultTimerGroup = tmp;
}
- llvm_release_global_lock();
return tmp;
}