mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 19:59:57 +00:00
Insert a SmartMutex templated class into the class hierarchy, which takes a template parameter specifying whether this mutex
should become a no-op when not running in multithreaded mode. Make sys::Mutex a typedef of SmartMutex<false>, to preserve source compatibility. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73709 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e53118ea32
commit
b849a4dd4b
@ -14,12 +14,14 @@
|
||||
#ifndef LLVM_SYSTEM_MUTEX_H
|
||||
#define LLVM_SYSTEM_MUTEX_H
|
||||
|
||||
#include "llvm/System/Threading.h"
|
||||
|
||||
namespace llvm
|
||||
{
|
||||
namespace sys
|
||||
{
|
||||
/// @brief Platform agnostic Mutex class.
|
||||
class Mutex
|
||||
class MutexImpl
|
||||
{
|
||||
/// @name Constructors
|
||||
/// @{
|
||||
@ -30,11 +32,11 @@ namespace llvm
|
||||
/// also more likely to deadlock (same thread can't acquire more than
|
||||
/// once).
|
||||
/// @brief Default Constructor.
|
||||
explicit Mutex(bool recursive = true);
|
||||
explicit MutexImpl(bool recursive = true);
|
||||
|
||||
/// Releases and removes the lock
|
||||
/// @brief Destructor
|
||||
~Mutex();
|
||||
~MutexImpl();
|
||||
|
||||
/// @}
|
||||
/// @name Methods
|
||||
@ -74,10 +76,46 @@ namespace llvm
|
||||
/// @name Do Not Implement
|
||||
/// @{
|
||||
private:
|
||||
Mutex(const Mutex & original);
|
||||
void operator=(const Mutex &);
|
||||
MutexImpl(const MutexImpl & original);
|
||||
void operator=(const MutexImpl &);
|
||||
/// @}
|
||||
};
|
||||
|
||||
|
||||
/// SmartMutex - A mutex with a compile time constant parameter that
|
||||
/// indicates whether this mutex should become a no-op when we're not
|
||||
/// running in multithreaded mode.
|
||||
template<bool mt_only>
|
||||
class SmartMutex {
|
||||
MutexImpl mtx;
|
||||
public:
|
||||
explicit SmartMutex(bool recursive = true) : mtx(recursive) { }
|
||||
|
||||
bool acquire() {
|
||||
if (!mt_only || (mt_only && llvm_is_multithreaded()))
|
||||
return mtx.acquire();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool release() {
|
||||
if (!mt_only || (mt_only && llvm_is_multithreaded()))
|
||||
return mtx.release();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool tryacquire() {
|
||||
if (!mt_only || (mt_only && llvm_is_multithreaded()))
|
||||
return mtx.tryacquire();
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
SmartMutex<mt_only>(const SmartMutex<mt_only> & original);
|
||||
void operator=(const SmartMutex<mt_only> &);
|
||||
};
|
||||
|
||||
/// Mutex - A standard, always enforced mutex.
|
||||
typedef SmartMutex<false> Mutex;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,11 +23,11 @@
|
||||
// Define all methods as no-ops if threading is explicitly disabled
|
||||
namespace llvm {
|
||||
using namespace sys;
|
||||
Mutex::Mutex( bool recursive) { }
|
||||
Mutex::~Mutex() { }
|
||||
bool Mutex::acquire() { return true; }
|
||||
bool Mutex::release() { return true; }
|
||||
bool Mutex::tryacquire() { return true; }
|
||||
MutexImpl::MutexImpl( bool recursive) { }
|
||||
MutexImpl::~MutexImpl() { }
|
||||
bool MutexImpl::acquire() { return true; }
|
||||
bool MutexImpl::release() { return true; }
|
||||
bool MutexImpl::tryacquire() { return true; }
|
||||
}
|
||||
#else
|
||||
|
||||
@ -55,7 +55,7 @@ using namespace sys;
|
||||
static const bool pthread_enabled = true;
|
||||
|
||||
// Construct a Mutex using pthread calls
|
||||
Mutex::Mutex( bool recursive)
|
||||
MutexImpl::MutexImpl( bool recursive)
|
||||
: data_(0)
|
||||
{
|
||||
if (pthread_enabled)
|
||||
@ -94,7 +94,7 @@ Mutex::Mutex( bool recursive)
|
||||
}
|
||||
|
||||
// Destruct a Mutex
|
||||
Mutex::~Mutex()
|
||||
MutexImpl::~MutexImpl()
|
||||
{
|
||||
if (pthread_enabled)
|
||||
{
|
||||
@ -106,7 +106,7 @@ Mutex::~Mutex()
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::acquire()
|
||||
MutexImpl::acquire()
|
||||
{
|
||||
if (pthread_enabled)
|
||||
{
|
||||
@ -120,7 +120,7 @@ Mutex::acquire()
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::release()
|
||||
MutexImpl::release()
|
||||
{
|
||||
if (pthread_enabled)
|
||||
{
|
||||
@ -134,7 +134,7 @@ Mutex::release()
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::tryacquire()
|
||||
MutexImpl::tryacquire()
|
||||
{
|
||||
if (pthread_enabled)
|
||||
{
|
||||
|
@ -20,28 +20,28 @@ namespace llvm
|
||||
{
|
||||
using namespace sys;
|
||||
|
||||
Mutex::Mutex( bool recursive)
|
||||
MutexImpl::MutexImpl( bool recursive)
|
||||
{
|
||||
}
|
||||
|
||||
Mutex::~Mutex()
|
||||
MutexImpl::~MutexImpl()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::acquire()
|
||||
MutexImpl::MutexImpl()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::release()
|
||||
MutexImpl::release()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::tryacquire( void )
|
||||
MutexImpl::tryacquire( void )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -22,13 +22,13 @@
|
||||
namespace llvm {
|
||||
using namespace sys;
|
||||
|
||||
Mutex::Mutex(bool /*recursive*/)
|
||||
MutexImpl::MutexImpl(bool /*recursive*/)
|
||||
{
|
||||
data_ = new CRITICAL_SECTION;
|
||||
InitializeCriticalSection((LPCRITICAL_SECTION)data_);
|
||||
}
|
||||
|
||||
Mutex::~Mutex()
|
||||
MutexImpl::~MutexImpl()
|
||||
{
|
||||
DeleteCriticalSection((LPCRITICAL_SECTION)data_);
|
||||
delete (LPCRITICAL_SECTION)data_;
|
||||
@ -36,21 +36,21 @@ Mutex::~Mutex()
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::acquire()
|
||||
MutexImpl::acquire()
|
||||
{
|
||||
EnterCriticalSection((LPCRITICAL_SECTION)data_);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::release()
|
||||
MutexImpl::release()
|
||||
{
|
||||
LeaveCriticalSection((LPCRITICAL_SECTION)data_);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
Mutex::tryacquire()
|
||||
MutexImpl::tryacquire()
|
||||
{
|
||||
return TryEnterCriticalSection((LPCRITICAL_SECTION)data_);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user