Almost there, almost there...
I'm taking things back to a point that the run-time checking
can be done and not create the hanging/crashing problems.
Signed-off-by: Marcelo Vanzin <mvanzin@vmware.com>
#endif
-/*
- *-----------------------------------------------------------------------------
- *
- * MXUserSetSignature --
- *
- * Set the signature of an MXUser object header
- *
- * A release build does not validate signatures but it does generate
- * them; should a release build lock get to debug build code the debug
- * build code will notice.
- *
- * A debug build generates and validates signatures. It will detect
- * problems with its own locks and lock problems for any other source.
- *
- * Dynamically altering the lock signature at run time allows the
- * run time code to detect that a lock "owned" by one library has
- * leaked and is being manipulated by another library. Even if the
- * libraries were compatible/identical that the lock escaped is a
- * problem.
- *
- * Results:
- * As above.
- *
- * Side effects:
- * None
- *
- *-----------------------------------------------------------------------------
- */
-
-void
-MXUserSetSignature(MXUserHeader *header, // IN/OUT:
- uint32 objectID) // IN:
-{
- ASSERT(header);
-
-#if defined(MXUSER_DEBUG)
- header->signature = objectID; // TODO: use objectID + (unique) syndrome
-#else
- header->signature = objectID;
-#endif
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- *
- * MXUserClearSignature --
- *
- * Remove any sign of a valid signature
- *
- * Results:
- * As above.
- *
- * Side effects:
- * None
- *
- *-----------------------------------------------------------------------------
- */
-
-void
-MXUserClearSignature(MXUserHeader *header) // IN/OUT:
-{
- header->signature = 0;
-}
-
-
/*
*-----------------------------------------------------------------------------
*
barrier->configCount = count;
barrier->curContext = 0;
- MXUserSetSignature(&barrier->header, MXUSER_BARRIER_SIGNATURE);
+ barrier->header.signature = MXUSER_BARRIER_SIGNATURE;
barrier->header.name = properName;
barrier->header.rank = rank;
barrier->header.serialNumber = MXUserAllocSerialNumber();
__FUNCTION__);
}
+ barrier->header.signature = 0; // just in case...
+
MXUserRemoveFromList(&barrier->header);
MXUser_DestroyCondVar(barrier->contexts[0].condVar);
MXUser_DestroyCondVar(barrier->contexts[1].condVar);
MXUser_DestroyExclLock(barrier->lock);
- MXUserClearSignature(&barrier->header); // just in case...
free(barrier->header.name);
barrier->header.name = NULL;
free(barrier);
return NULL;
}
- MXUserSetSignature(&lock->header, MXUSER_EXCL_SIGNATURE);
+ lock->header.signature = MXUSER_EXCL_SIGNATURE;
lock->header.name = properName;
lock->header.rank = rank;
lock->header.serialNumber = MXUserAllocSerialNumber();
__FUNCTION__);
}
- MXUserClearSignature(&lock->header); // just in case...
+ lock->header.signature = 0; // just in case...
MXRecLockDestroy(&lock->recursiveLock);
MXRecLock *MXUserInternalSingleton(Atomic_Ptr *storage);
-void MXUserSetSignature(MXUserHeader *header,
- uint32 objectID);
-
-void MXUserClearSignature(MXUserHeader *header);
-
#if defined(MXUSER_DEBUG)
void MXUserAcquisitionTracking(MXUserHeader *header,
Bool checkRank);
properName = Util_SafeStrdup(userName);
}
- MXUserSetSignature(&lock->header, MXUSER_RW_SIGNATURE);
+ lock->header.signature = MXUSER_RW_SIGNATURE;
lock->header.name = properName;
lock->header.rank = rank;
lock->header.serialNumber = MXUserAllocSerialNumber();
__FUNCTION__);
}
- MXUserClearSignature(&lock->header); // just in case...
-
if (LIKELY(lock->useNative)) {
int err = MXUserNativeRWDestroy(&lock->nativeLock);
}
}
+ lock->header.signature = 0; // just in case...
+
MXRecLockDestroy(&lock->recursiveLock);
MXUserRemoveFromList(&lock->header);
lock->vmmLock = NULL;
Atomic_Write(&lock->refCount, 1);
- MXUserSetSignature(&lock->header, MXUSER_REC_SIGNATURE);
+ lock->header.signature = MXUSER_REC_SIGNATURE;
lock->header.name = properName;
lock->header.rank = rank;
lock->header.serialNumber = MXUserAllocSerialNumber();
}
}
- MXUserClearSignature(&lock->header); // just in case...
+ lock->header.signature = 0; // just in case...
free(lock->header.name);
lock->header.name = NULL;
free(lock);
lock = Util_SafeCalloc(1, sizeof(*lock));
- MXUserSetSignature(&lock->header, MXUSER_REC_SIGNATURE);
+ lock->header.signature = MXUSER_REC_SIGNATURE;
lock->header.name = Str_SafeAsprintf(NULL, "MX_%p", mutex);
lock->header.rank = rank;
lock->header.serialNumber = MXUserAllocSerialNumber();
if (LIKELY(MXUserInit(&sema->nativeSemaphore) == 0)) {
MXUserStats *stats;
- MXUserSetSignature(&sema->header, MXUSER_SEMA_SIGNATURE);
+ sema->header.signature = MXUSER_SEMA_SIGNATURE;
sema->header.name = properName;
sema->header.rank = rank;
sema->header.serialNumber = MXUserAllocSerialNumber();
__FUNCTION__);
}
- MXUserClearSignature(&sema->header); // just in case...
-
err = MXUserDestroy(&sema->nativeSemaphore);
if (UNLIKELY(err != 0)) {
__FUNCTION__, err);
}
+ sema->header.signature = 0; // just in case...
+
MXUserRemoveFromList(&sema->header);
stats = (MXUserStats *) Atomic_ReadPtr(&sema->statsMem);