MXUserHeader header;
MXRecLock recursiveLock;
Atomic_Ptr statsMem;
- Atomic_uint32 destroyRefCount;
- Atomic_uint32 destroyWasCalled;
+ Atomic_uint32 refCount;
/*
* This is the MX recursive lock override pointer. It is used within the
Warning("\tname %s\n", lock->header.name);
Warning("\trank 0x%X\n", lock->header.rank);
Warning("\tserial number %u\n", lock->header.serialNumber);
+ Warning("\treference count %u\n", Atomic_Read(&lock->refCount));
if (lock->vmmLock == NULL) {
MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
+ Atomic_Inc(&lock->refCount);
+
switch (command) {
case MXUSER_CONTROL_ACQUISITION_HISTO: {
MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
if (stats && (lock->vmmLock == NULL)) {
va_list a;
- uint64 minValue;
uint32 decades;
+ uint64 minValue;
+
va_start(a, command);
minValue = va_arg(a, uint64);
decades = va_arg(a, uint32);
if (stats && (lock->vmmLock == NULL)) {
va_list a;
- uint64 minValue;
uint32 decades;
+ uint64 minValue;
+
va_start(a, command);
minValue = va_arg(a, uint64);
decades = va_arg(a, uint32);
result = FALSE;
}
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
+
return result;
}
}
lock->vmmLock = NULL;
- Atomic_Write(&lock->destroyRefCount, 1);
- Atomic_Write(&lock->destroyWasCalled, 0);
+ Atomic_Write(&lock->refCount, 1);
lock->header.signature = MXUSER_REC_SIGNATURE;
lock->header.name = properName;
{
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
- if (Atomic_FetchAndDec(&lock->destroyRefCount) == 1) {
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
if (lock->vmmLock == NULL) {
MXUserStats *stats;
MXUser_DestroyRecLock(MXUserRecLock *lock) // IN:
{
if (lock != NULL) {
- ASSERT(lock->header.signature == MXUSER_REC_SIGNATURE);
-
- /*
- * May not call destroy on a lock more than once
- *
- * That the code can get here may only occur if the reference count
- * mechanism is used.
- */
-
- if (Atomic_FetchAndInc(&lock->destroyWasCalled) != 0) {
- MXUserDumpAndPanic(&lock->header,
- "%s: Destroy of a destroyed recursive lock\n",
- __FUNCTION__);
- }
-
MXUserCondDestroyRecLock(lock);
}
}
*-----------------------------------------------------------------------------
*/
-static void
-MXUserAcquireRecLock(MXUserRecLock *lock) // IN/OUT:
+void
+MXUser_AcquireRecLock(MXUserRecLock *lock) // IN/OUT:
{
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
+ Atomic_Inc(&lock->refCount);
+
if (lock->vmmLock) {
ASSERT(MXUserMX_LockRec);
(*MXUserMX_LockRec)(lock->vmmLock);
MXRecLockAcquire(&lock->recursiveLock);
}
}
-}
-
-
-void
-MXUser_AcquireRecLock(MXUserRecLock *lock) // IN/OUT:
-{
- ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
-
- ASSERT(Atomic_Read(&lock->destroyWasCalled) == 0);
- MXUserAcquireRecLock(lock);
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
}
{
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
+ Atomic_Inc(&lock->refCount);
+
if (lock->vmmLock) {
ASSERT(MXUserMX_UnlockRec);
(*MXUserMX_UnlockRec)(lock->vmmLock);
MXRecLockRelease(&lock->recursiveLock);
}
+
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
}
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
- if (UNLIKELY(Atomic_Read(&lock->destroyWasCalled) != 0)) {
- return FALSE;
- }
+ Atomic_Inc(&lock->refCount);
if (lock->vmmLock) {
ASSERT(MXUserMX_TryLockRec);
}
}
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
+
return success;
}
*/
Bool
-MXUser_IsCurThreadHoldingRecLock(const MXUserRecLock *lock) // IN:
+MXUser_IsCurThreadHoldingRecLock(MXUserRecLock *lock) // IN:
{
Bool result;
+
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
+ Atomic_Inc(&lock->refCount);
+
if (lock->vmmLock) {
ASSERT(MXUserMX_IsLockedByCurThreadRec);
result = (*MXUserMX_IsLockedByCurThreadRec)(lock->vmmLock);
result = MXRecLockIsOwner(&lock->recursiveLock);
}
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
+
return result;
}
MXUserCondVar *
MXUser_CreateCondVarRecLock(MXUserRecLock *lock)
{
+ MXUserCondVar *condVar;
+
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
ASSERT(lock->vmmLock == NULL); // only unbound locks
- return MXUserCreateCondVar(&lock->header, &lock->recursiveLock);
+ Atomic_Inc(&lock->refCount);
+
+ condVar = MXUserCreateCondVar(&lock->header, &lock->recursiveLock);
+
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
+
+ return condVar;
}
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
ASSERT(lock->vmmLock == NULL); // only unbound locks
+ Atomic_Inc(&lock->refCount);
+
MXUserWaitCondVar(&lock->header, &lock->recursiveLock, condVar,
MXUSER_WAIT_INFINITE);
+
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
}
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
ASSERT(lock->vmmLock == NULL); // only unbound locks
+ Atomic_Inc(&lock->refCount);
+
MXUserWaitCondVar(&lock->header, &lock->recursiveLock, condVar, msecWait);
+
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
}
{
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
+ Atomic_Inc(&lock->refCount);
+
MXUserDumpRecLock(&lock->header);
+
+ if (Atomic_FetchAndDec(&lock->refCount) == 1) {
+ Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
+ }
}
lock->header.statsFunc = NULL;
Atomic_WritePtr(&lock->statsMem, NULL);
- Atomic_Write(&lock->destroyRefCount, 1);
- Atomic_Write(&lock->destroyWasCalled, 0);
+ Atomic_Write(&lock->refCount, 1);
lock->vmmLock = mutex;
{
ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
- Atomic_Inc(&lock->destroyRefCount);
+ Atomic_Inc(&lock->refCount);
}
}
-/*
- *-----------------------------------------------------------------------------
- *
- * MXUser_AcquireWeakRefRecLock --
- *
- * Acquire a lock only if destroy has not be called on it. This is
- * special implementation that will have limited lifetime. Once Poll
- * is upgraded to use trylock this implementation will go away.
- *
- * Results:
- * As above
- *
- * Side effects:
- * None
- *
- *-----------------------------------------------------------------------------
- */
-
-Bool
-MXUser_AcquireWeakRefRecLock(MXUserRecLock *lock) // IN:
-{
- ASSERT(lock && (lock->header.signature == MXUSER_REC_SIGNATURE));
-
- if (Atomic_Read(&lock->destroyWasCalled) != 0) {
- return FALSE;
- } else {
- MXUserAcquireRecLock(lock);
-
- return TRUE;
- }
-}
-
-
#if defined(VMX86_VMX)
#include "mutex.h"
#include "mutexRankVMX.h"