mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-08 08:54:58 +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
|
#ifndef LLVM_SYSTEM_MUTEX_H
|
||||||
#define LLVM_SYSTEM_MUTEX_H
|
#define LLVM_SYSTEM_MUTEX_H
|
||||||
|
|
||||||
|
#include "llvm/System/Threading.h"
|
||||||
|
|
||||||
namespace llvm
|
namespace llvm
|
||||||
{
|
{
|
||||||
namespace sys
|
namespace sys
|
||||||
{
|
{
|
||||||
/// @brief Platform agnostic Mutex class.
|
/// @brief Platform agnostic Mutex class.
|
||||||
class Mutex
|
class MutexImpl
|
||||||
{
|
{
|
||||||
/// @name Constructors
|
/// @name Constructors
|
||||||
/// @{
|
/// @{
|
||||||
@ -30,11 +32,11 @@ namespace llvm
|
|||||||
/// also more likely to deadlock (same thread can't acquire more than
|
/// also more likely to deadlock (same thread can't acquire more than
|
||||||
/// once).
|
/// once).
|
||||||
/// @brief Default Constructor.
|
/// @brief Default Constructor.
|
||||||
explicit Mutex(bool recursive = true);
|
explicit MutexImpl(bool recursive = true);
|
||||||
|
|
||||||
/// Releases and removes the lock
|
/// Releases and removes the lock
|
||||||
/// @brief Destructor
|
/// @brief Destructor
|
||||||
~Mutex();
|
~MutexImpl();
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
/// @name Methods
|
/// @name Methods
|
||||||
@ -74,10 +76,46 @@ namespace llvm
|
|||||||
/// @name Do Not Implement
|
/// @name Do Not Implement
|
||||||
/// @{
|
/// @{
|
||||||
private:
|
private:
|
||||||
Mutex(const Mutex & original);
|
MutexImpl(const MutexImpl & original);
|
||||||
void operator=(const Mutex &);
|
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
|
// Define all methods as no-ops if threading is explicitly disabled
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
using namespace sys;
|
using namespace sys;
|
||||||
Mutex::Mutex( bool recursive) { }
|
MutexImpl::MutexImpl( bool recursive) { }
|
||||||
Mutex::~Mutex() { }
|
MutexImpl::~MutexImpl() { }
|
||||||
bool Mutex::acquire() { return true; }
|
bool MutexImpl::acquire() { return true; }
|
||||||
bool Mutex::release() { return true; }
|
bool MutexImpl::release() { return true; }
|
||||||
bool Mutex::tryacquire() { return true; }
|
bool MutexImpl::tryacquire() { return true; }
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ using namespace sys;
|
|||||||
static const bool pthread_enabled = true;
|
static const bool pthread_enabled = true;
|
||||||
|
|
||||||
// Construct a Mutex using pthread calls
|
// Construct a Mutex using pthread calls
|
||||||
Mutex::Mutex( bool recursive)
|
MutexImpl::MutexImpl( bool recursive)
|
||||||
: data_(0)
|
: data_(0)
|
||||||
{
|
{
|
||||||
if (pthread_enabled)
|
if (pthread_enabled)
|
||||||
@ -94,7 +94,7 @@ Mutex::Mutex( bool recursive)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Destruct a Mutex
|
// Destruct a Mutex
|
||||||
Mutex::~Mutex()
|
MutexImpl::~MutexImpl()
|
||||||
{
|
{
|
||||||
if (pthread_enabled)
|
if (pthread_enabled)
|
||||||
{
|
{
|
||||||
@ -106,7 +106,7 @@ Mutex::~Mutex()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::acquire()
|
MutexImpl::acquire()
|
||||||
{
|
{
|
||||||
if (pthread_enabled)
|
if (pthread_enabled)
|
||||||
{
|
{
|
||||||
@ -120,7 +120,7 @@ Mutex::acquire()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::release()
|
MutexImpl::release()
|
||||||
{
|
{
|
||||||
if (pthread_enabled)
|
if (pthread_enabled)
|
||||||
{
|
{
|
||||||
@ -134,7 +134,7 @@ Mutex::release()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::tryacquire()
|
MutexImpl::tryacquire()
|
||||||
{
|
{
|
||||||
if (pthread_enabled)
|
if (pthread_enabled)
|
||||||
{
|
{
|
||||||
|
@ -20,28 +20,28 @@ namespace llvm
|
|||||||
{
|
{
|
||||||
using namespace sys;
|
using namespace sys;
|
||||||
|
|
||||||
Mutex::Mutex( bool recursive)
|
MutexImpl::MutexImpl( bool recursive)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex::~Mutex()
|
MutexImpl::~MutexImpl()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::acquire()
|
MutexImpl::MutexImpl()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::release()
|
MutexImpl::release()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::tryacquire( void )
|
MutexImpl::tryacquire( void )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -22,13 +22,13 @@
|
|||||||
namespace llvm {
|
namespace llvm {
|
||||||
using namespace sys;
|
using namespace sys;
|
||||||
|
|
||||||
Mutex::Mutex(bool /*recursive*/)
|
MutexImpl::MutexImpl(bool /*recursive*/)
|
||||||
{
|
{
|
||||||
data_ = new CRITICAL_SECTION;
|
data_ = new CRITICAL_SECTION;
|
||||||
InitializeCriticalSection((LPCRITICAL_SECTION)data_);
|
InitializeCriticalSection((LPCRITICAL_SECTION)data_);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mutex::~Mutex()
|
MutexImpl::~MutexImpl()
|
||||||
{
|
{
|
||||||
DeleteCriticalSection((LPCRITICAL_SECTION)data_);
|
DeleteCriticalSection((LPCRITICAL_SECTION)data_);
|
||||||
delete (LPCRITICAL_SECTION)data_;
|
delete (LPCRITICAL_SECTION)data_;
|
||||||
@ -36,21 +36,21 @@ Mutex::~Mutex()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::acquire()
|
MutexImpl::acquire()
|
||||||
{
|
{
|
||||||
EnterCriticalSection((LPCRITICAL_SECTION)data_);
|
EnterCriticalSection((LPCRITICAL_SECTION)data_);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::release()
|
MutexImpl::release()
|
||||||
{
|
{
|
||||||
LeaveCriticalSection((LPCRITICAL_SECTION)data_);
|
LeaveCriticalSection((LPCRITICAL_SECTION)data_);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Mutex::tryacquire()
|
MutexImpl::tryacquire()
|
||||||
{
|
{
|
||||||
return TryEnterCriticalSection((LPCRITICAL_SECTION)data_);
|
return TryEnterCriticalSection((LPCRITICAL_SECTION)data_);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user