DWORD err;
Bool signalled;
+ uint32 lockCount = MXRecLockCount(lock);
DWORD waitTime = (msecWait == MXUSER_WAIT_INFINITE) ? INFINITE : msecWait;
if (pSleepConditionVariableCS) {
* The MXUser internal accounting information must be maintained.
*/
- MXRecLockDecCount(lock);
+ MXRecLockDecCount(lock, lockCount);
success = (*pSleepConditionVariableCS)(&condVar->x.condObject,
&lock->nativeLock, waitTime);
err = success ? ERROR_SUCCESS : GetLastError();
- MXRecLockIncCount(lock, GetReturnAddress());
+ MXRecLockIncCount(lock, GetReturnAddress(), lockCount);
signalled = (err == ERROR_SUCCESS) ? TRUE : FALSE;
} else {
Bool done = FALSE;
condVar->x.compat.numWaiters++;
LeaveCriticalSection(&condVar->x.compat.condVarLock);
+ MXRecLockDecCount(lock, lockCount - 1);
MXRecLockRelease(lock);
do {
} while (!done);
MXRecLockAcquire(lock, GetReturnAddress());
+ MXRecLockIncCount(lock, GetReturnAddress(), lockCount - 1);
}
if (err != ERROR_SUCCESS) {
{
int err;
Bool signalled;
+ uint32 lockCount = MXRecLockCount(lock);
/*
* When using the native lock found within the MXUser lock, be sure to
* MXUser internal accounting information must be maintained.
*/
- MXRecLockDecCount(lock);
+ MXRecLockDecCount(lock, lockCount);
if (msecWait == MXUSER_WAIT_INFINITE) {
err = pthread_cond_wait(&condVar->condObject, &lock->nativeLock);
}
}
- MXRecLockIncCount(lock, GetReturnAddress());
+ MXRecLockIncCount(lock, GetReturnAddress(), lockCount);
if (err != 0) {
MXUserDumpAndPanic(header, "%s: failure %d on condVar (%p; %s)\n",
__FUNCTION__, header->lockName, condVar->name);
}
- if (MXRecLockCount(lock) == 0) {
+ if (!MXRecLockIsOwner(lock)) {
MXUserDumpAndPanic(header,
- "%s: unlocked lock %s with condVar (%p; %s)\n",
+ "%s: do not own lock %s for condVar (%p; %s)\n",
__FUNCTION__, header->lockName, condVar->name);
}
static INLINE void
MXRecLockIncCount(MXRecLock *lock, // IN/OUT:
- void *location) // IN:
+ void *location, // IN:
+ uint32 count) // IN:
{
if (MXRecLockCount(lock) == 0) {
#if defined(MXUSER_DEBUG)
MXRecLockSetOwner(lock);
}
- lock->referenceCount++;
+ lock->referenceCount += count;
}
ASSERT(lock->referenceCount == 0);
}
- MXRecLockIncCount(lock, location);
+ MXRecLockIncCount(lock, location, 1);
return contended;
}
err = MXRecLockTryAcquireInternal(lock);
if (err == 0) {
- MXRecLockIncCount(lock, location);
+ MXRecLockIncCount(lock, location, 1);
ASSERT((MXRecLockCount(lock) > 0) &&
(MXRecLockCount(lock) < MXUSER_MAX_REC_DEPTH));
}
static INLINE void
-MXRecLockDecCount(MXRecLock *lock) // IN/OUT:
+MXRecLockDecCount(MXRecLock *lock, // IN/OUT:
+ uint32 count) // IN:
{
- lock->referenceCount--;
+ ASSERT(count <= lock->referenceCount);
+ lock->referenceCount -= count;
if (MXRecLockCount(lock) == 0) {
MXRecLockSetNoOwner(lock);
ASSERT((MXRecLockCount(lock) > 0) &&
(MXRecLockCount(lock) < MXUSER_MAX_REC_DEPTH));
- MXRecLockDecCount(lock);
+ MXRecLockDecCount(lock, 1);
if (MXRecLockCount(lock) == 0) {
int err = MXRecLockReleaseInternal(lock);