(svn r26349) -Add: Optional recursive locking of mutexes.
This commit is contained in:
@@ -95,9 +95,10 @@ class ThreadMutex_OS2 : public ThreadMutex {
|
||||
private:
|
||||
HMTX mutex; ///< The mutex.
|
||||
HEV event; ///< Event for waiting.
|
||||
uint recursive_count; ///< Recursive lock count.
|
||||
|
||||
public:
|
||||
ThreadMutex_OS2()
|
||||
ThreadMutex_OS2() : recursive_count(0)
|
||||
{
|
||||
DosCreateMutexSem(NULL, &mutex, 0, FALSE);
|
||||
DosCreateEventSem(NULL, &event, 0, FALSE);
|
||||
@@ -109,21 +110,30 @@ public:
|
||||
DosCloseEventSem(event);
|
||||
}
|
||||
|
||||
/* virtual */ void BeginCritical()
|
||||
/* virtual */ void BeginCritical(bool allow_recursive = false)
|
||||
{
|
||||
/* os2 mutex is recursive by itself */
|
||||
DosRequestMutexSem(mutex, (unsigned long) SEM_INDEFINITE_WAIT);
|
||||
this->recursive_count++;
|
||||
if (!allow_recursive && this->recursive_count != 1) NOT_REACHED();
|
||||
}
|
||||
|
||||
/* virtual */ void EndCritical()
|
||||
/* virtual */ void EndCritical(bool allow_recursive = false)
|
||||
{
|
||||
if (!allow_recursive && this->recursive_count != 1) NOT_REACHED();
|
||||
this->recursive_count--;
|
||||
DosReleaseMutexSem(mutex);
|
||||
}
|
||||
|
||||
/* virtual */ void WaitForSignal()
|
||||
{
|
||||
assert(this->recursive_count == 1); // Do we need to call Begin/EndCritical multiple times otherwise?
|
||||
uint old_recursive_count = this->recursive_count;
|
||||
this->recursive_count = 0;
|
||||
this->EndCritical();
|
||||
DosWaitEventSem(event, SEM_INDEFINITE_WAIT);
|
||||
this->BeginCritical();
|
||||
this->recursive_count = this->recursive_count;
|
||||
}
|
||||
|
||||
/* virtual */ void SendSignal()
|
||||
|
Reference in New Issue
Block a user