Aria
2.8.0
|
Cross-platform mutex wrapper class. More...
#include <ArMutex.h>
Public Types | |
typedef pthread_mutex_t | MutexType |
enum | Status { STATUS_FAILED_INIT =1, STATUS_FAILED, STATUS_ALREADY_LOCKED } |
Public Member Functions | |
ArMutex (bool recursive=true) | |
Constructor. More... | |
ArMutex (const ArMutex &mutex) | |
Copy constructor. | |
virtual const char * | getError (int messageNumber) const |
Get a human readable error message from an error code. | |
virtual MutexType & | getMutex () |
Get a reference to the underlying OS-specific mutex variable. | |
virtual int | lock () |
Lock the mutex. More... | |
void | setLog (bool log) |
Sets a flag that will log out when we lock and unlock. More... | |
void | setLogName (const char *logName) |
Sets a name we'll use to log with. | |
void | setLogNameVar (const char *logName,...) |
Sets a name we'll use to log with formatting. More... | |
virtual int | tryLock () |
Try to lock the mutex, but do not block. More... | |
virtual int | unlock () |
Unlock the mutex, allowing another thread to obtain the lock. | |
virtual | ~ArMutex () |
Destructor. | |
Static Public Member Functions | |
static double | getLockWarningTime (void) |
Gets the lock warning time (sec) More... | |
static double | getUnlockWarningTime (void) |
Gets the lock warning time (sec) More... | |
static void | setLockWarningTime (double lockWarningSeconds) |
Sets the lock warning time (sec). More... | |
static void | setUnlockWarningTime (double unlockWarningSeconds) |
Sets the unlock warning time (sec). More... | |
Protected Member Functions | |
void | checkLockTime () |
void | checkUnlockTime () |
void | initLockTiming () |
void | startLockTimer () |
void | startUnlockTimer () |
void | uninitLockTiming () |
Protected Attributes | |
bool | myFailedInit |
bool | myFirstLock |
ArTime * | myLockStarted |
ArTime * | myLockTime |
bool | myLog |
std::string | myLogName |
MutexType | myMutex |
bool | myNonRecursive |
ArStrMap | myStrMap |
bool | myWasAlreadyLocked |
Static Protected Attributes | |
static unsigned int | ourLockWarningMS = 0 |
static ArFunctor * | ourNonRecursiveDeadlockFunctor = NULL |
static unsigned int | ourUnlockWarningMS = 0 |
Cross-platform mutex wrapper class.
This class wraps the operating system's mutex functions. It allows mutualy exclusive access to a critical section. This is extremely useful for multiple threads which want to use the same variable. On Linux, ArMutex simply uses the POSIX pthread interface in an object oriented manner. It also applies the same concept to Windows using Windows' own abilities to restrict access to critical sections. ArMutex also adds additional diagnostic/debugging tools such as logging and timing.
enum ArMutex::Status |
ArMutex::ArMutex | ( | bool | recursive = true | ) |
Constructor.
KMC TESTING myStrMap[STATUS_FAILED_INIT]="Failed to initialize"; myStrMap[STATUS_FAILED]="General failure"; myStrMap[STATUS_ALREADY_LOCKED]="Mutex already locked";
|
inlinestatic |
Gets the lock warning time (sec)
|
inlinestatic |
Gets the lock warning time (sec)
|
virtual |
Lock the mutex.
If this is a recursive mutex (the default type), and a different thread has locked this mutex, then block until it is unlocked; if this thread has locked this mutex, then continue immediately and do not block.
If this is not a recursive mutex, then block if any thread (including this thread) has locked this mutex.
Call setLog(true) to enable extra logging.
This function will block until no other thread has this mutex locked. If it returns 0, then it obtained the lock and the thread is free to use the critical section that this mutex protects. Else it returns an error code. See getError().
|
inlinestatic |
Sets the lock warning time (sec).
If it takes more than lockWarningSeconds to perform the mutex lock in lock(), log a warning.
|
inline |
Sets a flag that will log out when we lock and unlock.
Use setLogName() to set a descriptive name for this mutex, and ArThread::setThreadName() to set a descriptive name for a thread.
void ArMutex::setLogNameVar | ( | const char * | logName, |
... | |||
) |
Sets a name we'll use to log with formatting.
Java and Python Wrappers: Not available in Java or Python wrapper libraries. use setLogName()
|
inlinestatic |
|
virtual |
Try to lock the mutex, but do not block.
Try to lock the mutex.
If this is a recursive mutex (the default type), and a different thread has locked this mutex, then return ArMutex::STATUS_ALREADY_LOCKED; if this thread has locked this mutex, then return 0.
If this is not a recursive mutex, then return 0 if any thread (including this thread) has locked this mutex.
Returns ArMutex::STATUS_FAILED or ArMutex::STATUS_FAILED_INIT on an error (such as threading not initialized or supported).
Call setLog(true) to enable extra logging.
This function will not block if another thread has the mutex locked. It will return instantly if that is the case. It will return STATUS_ALREADY_LOCKED if another thread has the mutex locked. If it obtains the lock, it will return 0.