Skip to content

Commit

Permalink
Users of the llvm global mutex must now acquire it manually.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Zachary Turner committed Jun 16, 2014
1 parent 8b3a8d6 commit 9be5c8c
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 26 deletions.
4 changes: 3 additions & 1 deletion include/llvm/Support/Mutex.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
#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.
Expand Down
13 changes: 5 additions & 8 deletions include/llvm/Support/Threading.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@
#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
Expand All @@ -33,14 +38,6 @@ namespace llvm {
/// 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.
///
Expand Down
5 changes: 2 additions & 3 deletions lib/Support/ManagedStatic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#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;

Expand All @@ -23,7 +24,7 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
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();
Expand All @@ -43,8 +44,6 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
Next = StaticList;
StaticList = this;
}

llvm_release_global_lock();
} else {
assert(!Ptr && !DeleterFn && !Next &&
"Partially initialized ManagedStatic!?");
Expand Down
15 changes: 4 additions & 11 deletions lib/Support/Threading.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ using namespace llvm;

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().
Expand All @@ -47,22 +49,13 @@ void llvm::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 <pthread.h>

Expand Down
5 changes: 2 additions & 3 deletions lib/Support/Timer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#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;
Expand Down Expand Up @@ -84,14 +84,13 @@ static TimerGroup *getDefaultTimerGroup() {
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;
}
Expand Down

0 comments on commit 9be5c8c

Please sign in to comment.