mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
Users of the llvm global mutex must now acquire it manually.
This allows the mutex to be acquired in a guarded, RAII fashion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211066 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8b3a8d6343
commit
9be5c8ca6b
@ -15,11 +15,13 @@
|
|||||||
#define LLVM_SUPPORT_MUTEX_H
|
#define LLVM_SUPPORT_MUTEX_H
|
||||||
|
|
||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/Threading.h"
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
namespace llvm
|
namespace llvm
|
||||||
{
|
{
|
||||||
|
// Forward declare.
|
||||||
|
bool llvm_is_multithreaded();
|
||||||
|
|
||||||
namespace sys
|
namespace sys
|
||||||
{
|
{
|
||||||
/// @brief Platform agnostic Mutex class.
|
/// @brief Platform agnostic Mutex class.
|
||||||
|
@ -14,7 +14,12 @@
|
|||||||
#ifndef LLVM_SUPPORT_THREADING_H
|
#ifndef LLVM_SUPPORT_THREADING_H
|
||||||
#define LLVM_SUPPORT_THREADING_H
|
#define LLVM_SUPPORT_THREADING_H
|
||||||
|
|
||||||
|
#include "llvm/Support/Mutex.h"
|
||||||
|
|
||||||
namespace llvm {
|
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
|
/// llvm_start_multithreaded - Allocate and initialize structures needed to
|
||||||
/// make LLVM safe for multithreading. The return value indicates whether
|
/// make LLVM safe for multithreading. The return value indicates whether
|
||||||
/// multithreaded initialization succeeded. LLVM will still be operational
|
/// multithreaded initialization succeeded. LLVM will still be operational
|
||||||
@ -33,14 +38,6 @@ namespace llvm {
|
|||||||
/// mode or not.
|
/// mode or not.
|
||||||
bool llvm_is_multithreaded();
|
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
|
/// llvm_execute_on_thread - Execute the given \p UserFn on a separate
|
||||||
/// thread, passing it the provided \p UserData.
|
/// thread, passing it the provided \p UserData.
|
||||||
///
|
///
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "llvm/Support/ManagedStatic.h"
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
#include "llvm/Config/config.h"
|
#include "llvm/Config/config.h"
|
||||||
#include "llvm/Support/Atomic.h"
|
#include "llvm/Support/Atomic.h"
|
||||||
|
#include "llvm/Support/MutexGuard.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
@ -23,7 +24,7 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
|
|||||||
void (*Deleter)(void*)) const {
|
void (*Deleter)(void*)) const {
|
||||||
assert(Creator);
|
assert(Creator);
|
||||||
if (llvm_is_multithreaded()) {
|
if (llvm_is_multithreaded()) {
|
||||||
llvm_acquire_global_lock();
|
llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
|
||||||
|
|
||||||
if (!Ptr) {
|
if (!Ptr) {
|
||||||
void* tmp = Creator();
|
void* tmp = Creator();
|
||||||
@ -43,8 +44,6 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
|
|||||||
Next = StaticList;
|
Next = StaticList;
|
||||||
StaticList = this;
|
StaticList = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm_release_global_lock();
|
|
||||||
} else {
|
} else {
|
||||||
assert(!Ptr && !DeleterFn && !Next &&
|
assert(!Ptr && !DeleterFn && !Next &&
|
||||||
"Partially initialized ManagedStatic!?");
|
"Partially initialized ManagedStatic!?");
|
||||||
|
@ -21,13 +21,15 @@ using namespace llvm;
|
|||||||
|
|
||||||
static bool multithreaded_mode = false;
|
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() {
|
bool llvm::llvm_start_multithreaded() {
|
||||||
#if LLVM_ENABLE_THREADS != 0
|
#if LLVM_ENABLE_THREADS != 0
|
||||||
assert(!multithreaded_mode && "Already multithreaded!");
|
assert(!multithreaded_mode && "Already multithreaded!");
|
||||||
multithreaded_mode = true;
|
multithreaded_mode = true;
|
||||||
global_lock = new sys::Mutex(true);
|
|
||||||
|
|
||||||
// We fence here to ensure that all initialization is complete BEFORE we
|
// We fence here to ensure that all initialization is complete BEFORE we
|
||||||
// return from llvm_start_multithreaded().
|
// return from llvm_start_multithreaded().
|
||||||
@ -47,7 +49,6 @@ void llvm::llvm_stop_multithreaded() {
|
|||||||
sys::MemoryFence();
|
sys::MemoryFence();
|
||||||
|
|
||||||
multithreaded_mode = false;
|
multithreaded_mode = false;
|
||||||
delete global_lock;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,14 +56,6 @@ bool llvm::llvm_is_multithreaded() {
|
|||||||
return multithreaded_mode;
|
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)
|
#if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
#include "llvm/Support/Format.h"
|
#include "llvm/Support/Format.h"
|
||||||
#include "llvm/Support/ManagedStatic.h"
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
#include "llvm/Support/Mutex.h"
|
#include "llvm/support/MutexGuard.h"
|
||||||
#include "llvm/Support/Process.h"
|
#include "llvm/Support/Process.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
@ -84,14 +84,13 @@ static TimerGroup *getDefaultTimerGroup() {
|
|||||||
sys::MemoryFence();
|
sys::MemoryFence();
|
||||||
if (tmp) return tmp;
|
if (tmp) return tmp;
|
||||||
|
|
||||||
llvm_acquire_global_lock();
|
llvm::MutexGuard Lock(llvm::llvm_get_global_lock());
|
||||||
tmp = DefaultTimerGroup;
|
tmp = DefaultTimerGroup;
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
|
tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
|
||||||
sys::MemoryFence();
|
sys::MemoryFence();
|
||||||
DefaultTimerGroup = tmp;
|
DefaultTimerGroup = tmp;
|
||||||
}
|
}
|
||||||
llvm_release_global_lock();
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user