forked from 0ad/0ad
Some thread utility classes - CLocker and CScopeLock, both using
pthread_mutex_(un)lock to do their stuff This was SVN commit r83.
This commit is contained in:
parent
dd364a5fcd
commit
8044b1d7ce
128
source/ps/ThreadUtil.h
Executable file
128
source/ps/ThreadUtil.h
Executable file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
ThreadUtil.h - Thread Utility Functions
|
||||
by Simon Brenner
|
||||
simon.brenner@home.se
|
||||
|
||||
--Overview--
|
||||
|
||||
Contains three classes: CMutex, CRWLock and CLocker.
|
||||
CMutex is a Mutual Exclusion lock that can be locked and unlocked. The Lock
|
||||
function waits for the current lock holder (if any) to release the lock and
|
||||
then acquires it.
|
||||
|
||||
CRWLock is a lock where any number of readers *or* one writer can hold the lock.
|
||||
|
||||
CLocker is a generic wrapper class that can wrap any data class with any locker
|
||||
class.
|
||||
|
||||
--Example--
|
||||
|
||||
CMutex usage:
|
||||
|
||||
CMutex protectData;
|
||||
|
||||
void function()
|
||||
{
|
||||
protectData.Lock();
|
||||
.. do stuff with data ..
|
||||
protectData.Unlock();
|
||||
}
|
||||
|
||||
CLocker usage:
|
||||
|
||||
class CDataClass {};
|
||||
CLocker<CDataClass> instance;
|
||||
|
||||
void function()
|
||||
{
|
||||
instance.Lock();
|
||||
.. do stuff with instance ..
|
||||
instance.Unlock();
|
||||
}
|
||||
|
||||
CLocker usage 2:
|
||||
|
||||
class CDataClass {};
|
||||
class CCustomLockerClass { void MyOwnLock(); void MyOwnUnlock(); };
|
||||
|
||||
CLocker<CDataClass, CCustomLockerClass> instance;
|
||||
|
||||
void function()
|
||||
{
|
||||
instance.MyOwnLock();
|
||||
.. do stuff with instance ..
|
||||
instance.MyOwnUnlock();
|
||||
}
|
||||
|
||||
--More Info--
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _ThreadUtil_h
|
||||
#define _ThreadUtil_h
|
||||
|
||||
//--------------------------------------------------------
|
||||
// Includes / Compiler directives
|
||||
//--------------------------------------------------------
|
||||
|
||||
#include "posix.h"
|
||||
|
||||
//-------------------------------------------------
|
||||
// Types
|
||||
//-------------------------------------------------
|
||||
|
||||
//-------------------------------------------------
|
||||
// Declarations
|
||||
//-------------------------------------------------
|
||||
|
||||
// CScopeLock
|
||||
// ---------------------------------------------------------------------| Class
|
||||
// Locks a CMutex over the objects lifetime
|
||||
class CScopeLock
|
||||
{
|
||||
public:
|
||||
inline CScopeLock(pthread_mutex_t &mutex): m_Mutex(mutex)
|
||||
{
|
||||
pthread_mutex_lock(&m_Mutex);
|
||||
}
|
||||
inline ~CScopeLock()
|
||||
{
|
||||
pthread_mutex_unlock(&m_Mutex);
|
||||
}
|
||||
|
||||
private:
|
||||
pthread_mutex_t &m_Mutex;
|
||||
};
|
||||
|
||||
// CLocker
|
||||
// ---------------------------------------------------------------------| Class
|
||||
// This will not give access to the wrapped class constructors directly,
|
||||
// to use them you have to do CLocker(CWrappedClass(args))
|
||||
|
||||
template <typename _T>
|
||||
struct CLocker: public _T
|
||||
{
|
||||
inline CLocker()
|
||||
{}
|
||||
|
||||
inline CLocker(const _T &arg): _T(arg)
|
||||
{}
|
||||
|
||||
inline CLocker(_T &arg): _T(arg)
|
||||
{}
|
||||
|
||||
inline void Lock()
|
||||
{
|
||||
pthread_mutex_lock(&m_Mutex);
|
||||
}
|
||||
|
||||
inline void Unlock()
|
||||
{
|
||||
pthread_mutex_unlock(&m_Mutex);
|
||||
}
|
||||
|
||||
pthread_mutex_t m_Mutex;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user