mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 14:17:59 +00:00
11ecfc88eb
The default value of this attribute is PTHREAD_PROCESS_PRIVATE, so there's no point in calling pthread_mutexattr_setpshared() to set that. See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getpshared.html This removes some ifdefs that tend to need to be extended for other platforms (e.g. for NaCl). Note that this call was in the first implementation of Mutex, added in r22403, so it doesn't appear to have been added in response to a performance problem. Differential Revision: http://llvm-reviews.chandlerc.com/D2633 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200360 91177308-0d34-0410-b5e6-96231b3b80d8
123 lines
3.2 KiB
C++
123 lines
3.2 KiB
C++
//===- Mutex.cpp - Mutual Exclusion Lock ------------------------*- 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 the llvm::sys::Mutex class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Config/config.h"
|
|
#include "llvm/Support/Mutex.h"
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
//=== WARNING: Implementation here must contain only TRULY operating system
|
|
//=== independent code.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0
|
|
// Define all methods as no-ops if threading is explicitly disabled
|
|
namespace llvm {
|
|
using namespace sys;
|
|
MutexImpl::MutexImpl( bool recursive) { }
|
|
MutexImpl::~MutexImpl() { }
|
|
bool MutexImpl::acquire() { return true; }
|
|
bool MutexImpl::release() { return true; }
|
|
bool MutexImpl::tryacquire() { return true; }
|
|
}
|
|
#else
|
|
|
|
#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK)
|
|
|
|
#include <cassert>
|
|
#include <pthread.h>
|
|
#include <stdlib.h>
|
|
|
|
namespace llvm {
|
|
using namespace sys;
|
|
|
|
// Construct a Mutex using pthread calls
|
|
MutexImpl::MutexImpl( bool recursive)
|
|
: data_(0)
|
|
{
|
|
// Declare the pthread_mutex data structures
|
|
pthread_mutex_t* mutex =
|
|
static_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t)));
|
|
pthread_mutexattr_t attr;
|
|
|
|
// Initialize the mutex attributes
|
|
int errorcode = pthread_mutexattr_init(&attr);
|
|
assert(errorcode == 0); (void)errorcode;
|
|
|
|
// Initialize the mutex as a recursive mutex, if requested, or normal
|
|
// otherwise.
|
|
int kind = ( recursive ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL );
|
|
errorcode = pthread_mutexattr_settype(&attr, kind);
|
|
assert(errorcode == 0);
|
|
|
|
// Initialize the mutex
|
|
errorcode = pthread_mutex_init(mutex, &attr);
|
|
assert(errorcode == 0);
|
|
|
|
// Destroy the attributes
|
|
errorcode = pthread_mutexattr_destroy(&attr);
|
|
assert(errorcode == 0);
|
|
|
|
// Assign the data member
|
|
data_ = mutex;
|
|
}
|
|
|
|
// Destruct a Mutex
|
|
MutexImpl::~MutexImpl()
|
|
{
|
|
pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
|
|
assert(mutex != 0);
|
|
pthread_mutex_destroy(mutex);
|
|
free(mutex);
|
|
}
|
|
|
|
bool
|
|
MutexImpl::acquire()
|
|
{
|
|
pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
|
|
assert(mutex != 0);
|
|
|
|
int errorcode = pthread_mutex_lock(mutex);
|
|
return errorcode == 0;
|
|
}
|
|
|
|
bool
|
|
MutexImpl::release()
|
|
{
|
|
pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
|
|
assert(mutex != 0);
|
|
|
|
int errorcode = pthread_mutex_unlock(mutex);
|
|
return errorcode == 0;
|
|
}
|
|
|
|
bool
|
|
MutexImpl::tryacquire()
|
|
{
|
|
pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
|
|
assert(mutex != 0);
|
|
|
|
int errorcode = pthread_mutex_trylock(mutex);
|
|
return errorcode == 0;
|
|
}
|
|
|
|
}
|
|
|
|
#elif defined(LLVM_ON_UNIX)
|
|
#include "Unix/Mutex.inc"
|
|
#elif defined( LLVM_ON_WIN32)
|
|
#include "Windows/Mutex.inc"
|
|
#else
|
|
#warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in Support/Mutex.cpp
|
|
#endif
|
|
#endif
|