Bool MXUser_TryAcquireExclLock(MXUserExclLock *lock) // IN/OUT: { Bool success; ASSERT(lock); MXUserValidateHeader(&lock->header, MXUSER_TYPE_EXCL); if (MXUserTryAcquireFail(lock->header.name)) { return FALSE; } success = MXRecLockTryAcquire(&lock->recursiveLock); if (success) { MXUserAcquisitionTracking(&lock->header, FALSE); if (vmx86_debug && (MXRecLockCount(&lock->recursiveLock) > 1)) { MXUserDumpAndPanic(&lock->header, "%s: Acquire on an acquired exclusive lock\n", __FUNCTION__); } } if (vmx86_stats) { MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem); if (LIKELY(stats != NULL)) { MXUserAcquisitionSample(&stats->acquisitionStats, success, !success, 0ULL); } } return success; }
Bool MXUser_TryAcquireRecLock(MXUserRecLock *lock) // IN/OUT: { Bool success; ASSERT(lock); MXUserValidateHeader(&lock->header, MXUSER_TYPE_REC); ASSERT(Atomic_Read(&lock->refCount) > 0); if (UNLIKELY(lock->vmmLock != NULL)) { ASSERT(MXUserMX_TryLockRec); success = (*MXUserMX_TryLockRec)(lock->vmmLock); } else { if (MXUserTryAcquireFail(lock->header.name)) { success = FALSE; goto bail; } success = MXRecLockTryAcquire(&lock->recursiveLock); if (success) { MXUserAcquisitionTracking(&lock->header, FALSE); } if (vmx86_stats) { MXUserAcquireStats *acquireStats; acquireStats = Atomic_ReadPtr(&lock->acquireStatsMem); if (LIKELY(acquireStats != NULL)) { MXUserAcquisitionSample(&acquireStats->data, success, !success, 0ULL); } } } bail: return success; }
void MXUser_PerLockData(void) { MXRecLock *listLock = MXUserInternalSingleton(&mxLockMemPtr); if (mxUserStatsFunc == NULL) { return; } if (listLock && MXRecLockTryAcquire(listLock)) { ListItem *entry; uint32 highestSerialNumber; static uint32 lastReportedSerialNumber = 0; highestSerialNumber = lastReportedSerialNumber; LIST_SCAN(entry, mxUserLockList) { MXUserHeader *header = LIST_CONTAINER(entry, MXUserHeader, item); /* Log the ID information for a lock that did exist previously */ if (header->bits.serialNumber > lastReportedSerialNumber) { MXUserStatsLog("MXUser: n n=%s l=%d r=0x%x\n", header->name, header->bits.serialNumber, header->rank); if (header->bits.serialNumber > highestSerialNumber) { highestSerialNumber = header->bits.serialNumber; } } /* * Perform the statistics action for any lock that has one. */ if (header->statsFunc) { (*header->statsFunc)(header); } }