(svn r26349) -Add: Optional recursive locking of mutexes.

This commit is contained in:
frosch
2014-02-16 21:37:05 +00:00
parent 53f4fd8ebf
commit 3a3c53cd45
5 changed files with 66 additions and 15 deletions

View File

@@ -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()