ASSERT(perThreadLock);
- MXRecLockAcquire(perThreadLock,
- NULL); // non-stats
+ MXRecLockAcquire(perThreadLock);
if (perThreadFreeList == NULL) {
perThread = Util_SafeMalloc(sizeof *perThread);
perThreadLock = MXUserInternalSingleton(&perThreadLockMem);
ASSERT(perThreadLock);
- MXRecLockAcquire(perThreadLock,
- NULL); // non-stats
+ MXRecLockAcquire(perThreadLock);
perThread->next = perThreadFreeList;
perThreadFreeList = perThread;
MXRecLockRelease(perThreadLock);
LeaveCriticalSection(&condVar->x.compat.condVarLock);
} while (!done);
- MXRecLockAcquire(lock,
- NULL); // non-stats
+ MXRecLockAcquire(lock);
MXRecLockIncCount(lock, lockCount - 1);
MXUserStatsActionExcl(MXUserHeader *header) // IN:
{
MXUserExclLock *lock = (MXUserExclLock *) header;
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
if (stats) {
Bool isHot;
switch (command) {
case MXUSER_CONTROL_ACQUISITION_HISTO: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- va_list a;
- uint64 minValue;
- uint32 decades;
+ if (stats == NULL) {
+ result = FALSE;
+ } else {
+ va_list a;
+ uint32 decades;
+ uint64 minValue;
- va_start(a, command);
- minValue = va_arg(a, uint64);
- decades = va_arg(a, uint32);
- va_end(a);
+ va_start(a, command);
+ minValue = va_arg(a, uint64);
+ decades = va_arg(a, uint32);
+ va_end(a);
- MXUserForceHisto(&stats->acquisitionHisto,
- MXUSER_STAT_CLASS_ACQUISITION, minValue, decades);
+ MXUserForceHisto(&stats->acquisitionHisto,
+ MXUSER_STAT_CLASS_ACQUISITION, minValue, decades);
+
+ result = TRUE;
+ }
- result = TRUE;
} else {
result = FALSE;
}
}
case MXUSER_CONTROL_HELD_HISTO: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- va_list a;
- uint32 minValue;
- uint32 decades;
+ if (stats == NULL) {
+ result = FALSE;
+ } else {
+ va_list a;
+ uint32 decades;
+ uint32 minValue;
- va_start(a, command);
- minValue = va_arg(a, uint64);
- decades = va_arg(a, uint32);
- va_end(a);
+ va_start(a, command);
+ minValue = va_arg(a, uint64);
+ decades = va_arg(a, uint32);
+ va_end(a);
- MXUserForceHisto(&stats->heldHisto, MXUSER_STAT_CLASS_HELD,
- minValue, decades);
+ MXUserForceHisto(&stats->heldHisto, MXUSER_STAT_CLASS_HELD,
+ minValue, decades);
- result = TRUE;
+ result = TRUE;
+ }
} else {
result = FALSE;
}
}
case MXUSER_CONTROL_ENABLE_STATS: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
-
- if (LIKELY(stats == NULL)) {
+ if (vmx86_stats) {
+ MXUserStats *stats;
MXUserStats *before;
stats = Util_SafeCalloc(1, sizeof(*stats));
MXUserAcquisitionStatsSetUp(&stats->acquisitionStats);
MXUserBasicStatsSetUp(&stats->heldStats, MXUSER_STAT_CLASS_HELD);
- before = (MXUserStats *) Atomic_ReadIfEqualWritePtr(&lock->statsMem,
- NULL,
- (void *) stats);
+ before = Atomic_ReadIfEqualWritePtr(&lock->statsMem, NULL,
+ (void *) stats);
if (before) {
free(stats);
}
lock->header.statsFunc = MXUserStatsActionExcl;
- }
- result = TRUE;
- break;
+ result = TRUE;
+ } else {
+ result = FALSE;
+ }
}
default:
{
MXUserExclLock *lock = (MXUserExclLock *) header;
- Warning("%s: Exclusive lock @ 0x%p\n", __FUNCTION__, lock);
+ Warning("%s: Exclusive lock @ %p\n", __FUNCTION__, lock);
Warning("\tsignature 0x%X\n", lock->header.signature);
Warning("\tname %s\n", lock->header.name);
Warning("\tcount %d\n", MXRecLockCount(&lock->recursiveLock));
- Warning("\taddress of owner data 0x%p\n",
+ Warning("\taddress of owner data %p\n",
&lock->recursiveLock.nativeThreadID);
}
MXUser_CreateExclLock(const char *userName, // IN:
MX_Rank rank) // IN:
{
+ Bool doStats;
char *properName;
MXUserExclLock *lock;
lock->header.serialNumber = MXUserAllocSerialNumber();
lock->header.dumpFunc = MXUserDumpExclLock;
- if (MXUserStatsEnabled()) {
+ if (vmx86_stats) {
+ doStats = MXUserStatsEnabled();
+ } else {
+ doStats = FALSE;
+ }
+
+ if (doStats) {
MXUser_ControlExclLock(lock, MXUSER_CONTROL_ENABLE_STATS);
} else {
lock->header.statsFunc = NULL;
MXUser_DestroyExclLock(MXUserExclLock *lock) // IN:
{
if (lock != NULL) {
- MXUserStats *stats;
-
MXUserValidateHeader(&lock->header, MXUSER_TYPE_EXCL);
if (MXRecLockCount(&lock->recursiveLock) > 0) {
MXUserRemoveFromList(&lock->header);
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
- MXUserBasicStatsTearDown(&stats->heldStats);
- MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
- MXUserHistoTearDown(Atomic_ReadPtr(&stats->heldHisto));
+ if (LIKELY(stats != NULL)) {
+ MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
+ MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
- free(stats);
+ MXUserBasicStatsTearDown(&stats->heldStats);
+ MXUserHistoTearDown(Atomic_ReadPtr(&stats->heldHisto));
+
+ free(stats);
+ }
}
free(lock->header.name);
void
MXUser_AcquireExclLock(MXUserExclLock *lock) // IN/OUT:
{
- MXUserStats *stats;
-
ASSERT(lock);
MXUserValidateHeader(&lock->header, MXUSER_TYPE_EXCL);
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
-
MXUserAcquisitionTracking(&lock->header, TRUE);
- if (stats) {
- MXUserHisto *histo;
- VmTimeType value = 0;
+ if (vmx86_stats) {
+ Bool contended;
+ VmTimeType start = 0;
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
+
+ if (LIKELY(stats != NULL)) {
+ start = Hostinfo_SystemTimerNS();
+ }
- MXRecLockAcquire(&lock->recursiveLock, &value);
+ contended = MXRecLockAcquire(&lock->recursiveLock);
- MXUserAcquisitionSample(&stats->acquisitionStats,
- TRUE,
- value != 0, // True if contended
- value);
+ if (LIKELY(stats != NULL)) {
+ MXUserHisto *histo;
+ VmTimeType value = Hostinfo_SystemTimerNS() - start;
- histo = Atomic_ReadPtr(&stats->acquisitionHisto);
+ MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended,
+ value);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, value, GetReturnAddress());
- }
+ histo = Atomic_ReadPtr(&stats->acquisitionHisto);
- stats->holdStart = Hostinfo_SystemTimerNS();
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, value, GetReturnAddress());
+ }
+
+ stats->holdStart = Hostinfo_SystemTimerNS();
+ }
} else {
- MXRecLockAcquire(&lock->recursiveLock,
- NULL); // non-stats
+ MXRecLockAcquire(&lock->recursiveLock);
}
if (vmx86_debug && (MXRecLockCount(&lock->recursiveLock) > 1)) {
void
MXUser_ReleaseExclLock(MXUserExclLock *lock) // IN/OUT:
{
- MXUserStats *stats;
-
ASSERT(lock);
MXUserValidateHeader(&lock->header, MXUSER_TYPE_EXCL);
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- VmTimeType value = Hostinfo_SystemTimerNS() - stats->holdStart;
- MXUserHisto *histo;
+ if (LIKELY(stats != NULL)) {
+ MXUserHisto *histo;
+ VmTimeType value = Hostinfo_SystemTimerNS() - stats->holdStart;
- MXUserBasicStatsSample(&stats->heldStats, value);
+ MXUserBasicStatsSample(&stats->heldStats, value);
- histo = Atomic_ReadPtr(&stats->heldHisto);
+ histo = Atomic_ReadPtr(&stats->heldHisto);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, value, GetReturnAddress());
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, value, GetReturnAddress());
+ }
}
}
MXUser_TryAcquireExclLock(MXUserExclLock *lock) // IN/OUT:
{
Bool success;
- MXUserStats *stats;
ASSERT(lock);
MXUserValidateHeader(&lock->header, MXUSER_TYPE_EXCL);
}
}
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- MXUserAcquisitionSample(&stats->acquisitionStats, success, !success,
- 0ULL);
+ if (LIKELY(stats != NULL)) {
+ MXUserAcquisitionSample(&stats->acquisitionStats, success, !success,
+ 0ULL);
+ }
}
return success;
ASSERT(lockStorage);
- lock = (MXUserExclLock *) Atomic_ReadPtr(lockStorage);
+ lock = Atomic_ReadPtr(lockStorage);
if (UNLIKELY(lock == NULL)) {
MXUserExclLock *newLock = MXUser_CreateExclLock(name, rank);
- lock = (MXUserExclLock *) Atomic_ReadIfEqualWritePtr(lockStorage, NULL,
- (void *) newLock);
+ lock = Atomic_ReadIfEqualWritePtr(lockStorage, NULL, (void *) newLock);
if (lock) {
MXUser_DestroyExclLock(newLock);
} else {
- lock = (MXUserExclLock *) Atomic_ReadPtr(lockStorage);
+ lock = Atomic_ReadPtr(lockStorage);
}
}
#include "vm_basic_types.h"
#include "vthreadBase.h"
-#include "hostinfo.h"
#include "circList.h"
}
-static INLINE void
-MXRecLockAcquire(MXRecLock *lock, // IN/OUT:
- VmTimeType *duration) // IN/OPT: !NULL for stats
+static INLINE Bool
+MXRecLockAcquire(MXRecLock *lock) // IN/OUT:
{
- if (duration != NULL) {
- *duration = 0ULL;
- }
+ int err;
if ((MXRecLockCount(lock) > 0) && MXRecLockIsOwner(lock)) {
MXRecLockIncCount(lock, 1);
- } else {
- int err = MXRecLockTryAcquireInternal(lock);
- if (err != 0) {
- VmTimeType start;
-
- if (vmx86_debug && (err != EBUSY)) {
- Panic("%s: MXRecLockTryAcquireInternal returned %d\n",
- __FUNCTION__, err);
- }
+ return FALSE; // Not contended
+ }
- if (duration != NULL) {
- start = Hostinfo_SystemTimerNS();
- }
+ err = MXRecLockTryAcquireInternal(lock);
- err = MXRecLockAcquireInternal(lock);
+ if (err == 0) {
+ MXRecLockIncCount(lock, 1);
- if (duration != NULL) {
- *duration = Hostinfo_SystemTimerNS() - start;
- }
- }
+ return FALSE; // Not contended
+ }
- if (vmx86_debug && (err != 0)) {
- Panic("%s: MXRecLockAcquireInternal returned %d\n", __FUNCTION__,
- err);
- }
+ if (vmx86_debug && (err != EBUSY)) {
+ Panic("%s: MXRecLockTryAcquireInternal error %d\n", __FUNCTION__, err);
+ }
- ASSERT(MXRecLockCount(lock) == 0);
+ err = MXRecLockAcquireInternal(lock);
- MXRecLockIncCount(lock, 1);
+ if (vmx86_debug && (err != 0)) {
+ Panic("%s: MXRecLockAcquireInternal error %d\n", __FUNCTION__, err);
}
+
+ ASSERT(MXRecLockCount(lock) == 0);
+
+ MXRecLockIncCount(lock, 1);
+
+ return TRUE; // Contended
}
static INLINE Bool
MXRecLockTryAcquire(MXRecLock *lock) // IN/OUT:
{
- Bool acquired;
+ int err;
if ((MXRecLockCount(lock) > 0) && MXRecLockIsOwner(lock)) {
- acquired = TRUE;
- } else {
- int err = MXRecLockTryAcquireInternal(lock);
-
- if (err == 0) {
- acquired = TRUE;
- } else {
- if (vmx86_debug && (err != EBUSY)) {
- Panic("%s: MXRecLockTryAcquireInternal returned %d\n",
- __FUNCTION__, err);
- }
-
- acquired = FALSE;
- }
+ MXRecLockIncCount(lock, 1);
+
+ return TRUE; // Was acquired
}
- if (acquired) {
+ err = MXRecLockTryAcquireInternal(lock);
+
+ if (err == 0) {
MXRecLockIncCount(lock, 1);
+
+ return TRUE; // Was acquired
+ }
+
+ if (vmx86_debug && (err != EBUSY)) {
+ Panic("%s: MXRecLockTryAcquireInternal error %d\n", __FUNCTION__, err);
}
- return acquired;
+ return FALSE; // Was not acquired
}
static INLINE void
MXUserStatsActionRW(MXUserHeader *header) // IN:
{
MXUserRWLock *lock = (MXUserRWLock *) header;
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
if (stats) {
Bool isHot;
switch (command) {
case MXUSER_CONTROL_ACQUISITION_HISTO: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- va_list a;
- uint64 minValue;
- uint32 decades;
+ if (stats == NULL) {
+ result = FALSE;
+ } else {
+ va_list a;
+ uint32 decades;
+ uint64 minValue;
- va_start(a, command);
- minValue = va_arg(a, uint64);
- decades = va_arg(a, uint32);
- va_end(a);
+ va_start(a, command);
+ minValue = va_arg(a, uint64);
+ decades = va_arg(a, uint32);
+ va_end(a);
- MXUserForceHisto(&stats->acquisitionHisto,
- MXUSER_STAT_CLASS_ACQUISITION, minValue, decades);
+ MXUserForceHisto(&stats->acquisitionHisto,
+ MXUSER_STAT_CLASS_ACQUISITION, minValue, decades);
- result = TRUE;
+ result = TRUE;
+ }
} else {
result = FALSE;
}
}
case MXUSER_CONTROL_HELD_HISTO: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- va_list a;
- uint32 minValue;
- uint32 decades;
+ if (stats == NULL) {
+ result = FALSE;
+ } else {
+ va_list a;
+ uint32 decades;
+ uint32 minValue;
- va_start(a, command);
- minValue = va_arg(a, uint64);
- decades = va_arg(a, uint32);
- va_end(a);
+ va_start(a, command);
+ minValue = va_arg(a, uint64);
+ decades = va_arg(a, uint32);
+ va_end(a);
- MXUserForceHisto(&stats->heldHisto, MXUSER_STAT_CLASS_HELD,
- minValue, decades);
+ MXUserForceHisto(&stats->heldHisto, MXUSER_STAT_CLASS_HELD,
+ minValue, decades);
- result = TRUE;
+ result = TRUE;
+ }
} else {
result = FALSE;
}
}
case MXUSER_CONTROL_ENABLE_STATS: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
-
- if (LIKELY(stats == NULL)) {
+ if (vmx86_stats) {
+ MXUserStats *stats;
MXUserStats *before;
stats = Util_SafeCalloc(1, sizeof(*stats));
MXUserAcquisitionStatsSetUp(&stats->acquisitionStats);
MXUserBasicStatsSetUp(&stats->heldStats, MXUSER_STAT_CLASS_HELD);
- before = (MXUserStats *) Atomic_ReadIfEqualWritePtr(&lock->statsMem,
- NULL,
- (void *) stats);
+ before = Atomic_ReadIfEqualWritePtr(&lock->statsMem, NULL,
+ (void *) stats);
if (before) {
free(stats);
}
lock->header.statsFunc = MXUserStatsActionRW;
+
+ result = TRUE;
+ } else {
+ result = FALSE;
}
- result = TRUE;
break;
}
lockInited = MXRecLockInit(&lock->recursiveLock);
if (LIKELY(lockInited)) {
+ Bool doStats;
+
lock->holderTable = HashTable_Alloc(256,
HASH_INT_KEY | HASH_FLAG_ATOMIC,
MXUserFreeHashEntry);
- if (MXUserStatsEnabled()) {
+ if (vmx86_stats) {
+ doStats = MXUserStatsEnabled();
+ } else {
+ doStats = FALSE;
+ }
+
+ if (doStats) {
MXUser_ControlRWLock(lock, MXUSER_CONTROL_ENABLE_STATS);
} else {
lock->header.statsFunc = NULL;
MXUser_DestroyRWLock(MXUserRWLock *lock) // IN:
{
if (LIKELY(lock != NULL)) {
- MXUserStats *stats;
-
MXUserValidateHeader(&lock->header, MXUSER_TYPE_RW);
if (Atomic_Read(&lock->holderCount) != 0) {
lock->header.signature = 0; // just in case...
- MXRecLockDestroy(&lock->recursiveLock);
+ MXRecLockDestroy(&lock->recursiveLock);
MXUserRemoveFromList(&lock->header);
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
- MXUserBasicStatsTearDown(&stats->heldStats);
- MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
- MXUserHistoTearDown(Atomic_ReadPtr(&stats->heldHisto));
+ if (LIKELY(stats != NULL)) {
+ MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
+ MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
- free(stats);
+ MXUserBasicStatsTearDown(&stats->heldStats);
+ MXUserHistoTearDown(Atomic_ReadPtr(&stats->heldHisto));
+
+ free(stats);
+ }
}
HashTable_FreeUnsafe(lock->holderTable);
MXUserAcquisition(MXUserRWLock *lock, // IN/OUT:
Bool forRead) // IN:
{
- MXUserStats *stats;
HolderContext *myContext;
ASSERT(lock);
"Write");
}
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ Bool contended;
+ VmTimeType start = 0;
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- VmTimeType value;
- MXUserHisto *histo;
+ if (LIKELY(stats != NULL)) {
+ start = Hostinfo_SystemTimerNS();
+ }
if (lock->useNative) {
int err = 0;
- Bool contended;
- VmTimeType begin = Hostinfo_SystemTimerNS();
contended = MXUserNativeRWAcquire(&lock->nativeLock, forRead, &err);
- value = contended ? Hostinfo_SystemTimerNS() - begin : 0;
-
if (UNLIKELY(err != 0)) {
MXUserDumpAndPanic(&lock->header, "%s: Error %d: contended %d\n",
__FUNCTION__, err, contended);
}
} else {
- value = 0;
-
- MXRecLockAcquire(&lock->recursiveLock, &value);
+ contended = MXRecLockAcquire(&lock->recursiveLock);
}
- /*
- * The statistics are not atomically safe so protect them when necessary.
- */
+ if (LIKELY(stats != NULL)) {
+ MXUserHisto *histo;
+ VmTimeType value = Hostinfo_SystemTimerNS() - start;
- if (forRead && lock->useNative) {
- MXRecLockAcquire(&lock->recursiveLock,
- NULL); // non-stats
- }
+ /*
+ * The statistics are not atomically safe so protect them when
+ * necessary.
+ */
- MXUserAcquisitionSample(&stats->acquisitionStats,
- TRUE,
- value != 0, // True when contended
- value);
+ if (forRead && lock->useNative) {
+ MXRecLockAcquire(&lock->recursiveLock);
+ }
- histo = Atomic_ReadPtr(&stats->acquisitionHisto);
+ MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended,
+ value);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, value, GetReturnAddress());
- }
+ histo = Atomic_ReadPtr(&stats->acquisitionHisto);
- if (forRead && lock->useNative) {
- MXRecLockRelease(&lock->recursiveLock);
- }
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, value, GetReturnAddress());
+ }
+
+ if (forRead && lock->useNative) {
+ MXRecLockRelease(&lock->recursiveLock);
+ }
- myContext->holdStart = Hostinfo_SystemTimerNS();
+ myContext->holdStart = Hostinfo_SystemTimerNS();
+ }
} else {
if (LIKELY(lock->useNative)) {
int err = 0;
__FUNCTION__, err);
}
} else {
- MXRecLockAcquire(&lock->recursiveLock,
- NULL); // non-stats
+ MXRecLockAcquire(&lock->recursiveLock);
}
}
void
MXUser_ReleaseRWLock(MXUserRWLock *lock) // IN/OUT:
{
- MXUserStats *stats;
HolderContext *myContext;
ASSERT(lock);
myContext = MXUserGetHolderContext(lock);
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- VmTimeType duration = Hostinfo_SystemTimerNS() - myContext->holdStart;
- MXUserHisto *histo;
+ if (LIKELY(stats != NULL)) {
+ MXUserHisto *histo;
+ VmTimeType duration = Hostinfo_SystemTimerNS() - myContext->holdStart;
- /*
- * The statistics are not always atomically safe so protect them
- * when necessary
- */
+ /*
+ * The statistics are not always atomically safe so protect them
+ * when necessary
+ */
- if ((myContext->state == RW_LOCKED_FOR_READ) && lock->useNative) {
- MXRecLockAcquire(&lock->recursiveLock,
- NULL); // non-stats
- }
+ if ((myContext->state == RW_LOCKED_FOR_READ) && lock->useNative) {
+ MXRecLockAcquire(&lock->recursiveLock);
+ }
- MXUserBasicStatsSample(&stats->heldStats, duration);
+ MXUserBasicStatsSample(&stats->heldStats, duration);
- histo = Atomic_ReadPtr(&stats->heldHisto);
+ histo = Atomic_ReadPtr(&stats->heldHisto);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, duration, GetReturnAddress());
- }
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, duration, GetReturnAddress());
+ }
- if ((myContext->state == RW_LOCKED_FOR_READ) && lock->useNative) {
- MXRecLockRelease(&lock->recursiveLock);
+ if ((myContext->state == RW_LOCKED_FOR_READ) && lock->useNative) {
+ MXRecLockRelease(&lock->recursiveLock);
+ }
}
}
ASSERT(lockStorage);
- lock = (MXUserRWLock *) Atomic_ReadPtr(lockStorage);
+ lock = Atomic_ReadPtr(lockStorage);
if (UNLIKELY(lock == NULL)) {
MXUserRWLock *newLock = MXUser_CreateRWLock(name, rank);
- lock = (MXUserRWLock *) Atomic_ReadIfEqualWritePtr(lockStorage, NULL,
- (void *) newLock);
+ lock = Atomic_ReadIfEqualWritePtr(lockStorage, NULL, (void *) newLock);
if (lock) {
MXUser_DestroyRWLock(newLock);
} else {
- lock = (MXUserRWLock *) Atomic_ReadPtr(lockStorage);
+ lock = Atomic_ReadPtr(lockStorage);
}
}
MXUserStatsActionRec(MXUserHeader *header) // IN:
{
MXUserRecLock *lock = (MXUserRecLock *) header;
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
if (stats) {
Bool isHot;
switch (command) {
case MXUSER_CONTROL_ACQUISITION_HISTO: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats && (lock->vmmLock == NULL)) {
- va_list a;
- uint32 decades;
- uint64 minValue;
+ if ((stats != NULL) && (lock->vmmLock == NULL)) {
+ va_list a;
+ uint32 decades;
+ uint64 minValue;
- va_start(a, command);
- minValue = va_arg(a, uint64);
- decades = va_arg(a, uint32);
- va_end(a);
+ va_start(a, command);
+ minValue = va_arg(a, uint64);
+ decades = va_arg(a, uint32);
+ va_end(a);
- MXUserForceHisto(&stats->acquisitionHisto,
- MXUSER_STAT_CLASS_ACQUISITION, minValue, decades);
+ MXUserForceHisto(&stats->acquisitionHisto,
+ MXUSER_STAT_CLASS_ACQUISITION, minValue, decades);
- result = TRUE;
+ result = TRUE;
+ } else {
+ result = FALSE;
+ }
} else {
result = FALSE;
}
+
break;
}
case MXUSER_CONTROL_HELD_HISTO: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats && (lock->vmmLock == NULL)) {
- va_list a;
- uint32 decades;
- uint64 minValue;
+ if ((stats != NULL) && (lock->vmmLock == NULL)) {
+ va_list a;
+ uint32 decades;
+ uint32 minValue;
- va_start(a, command);
- minValue = va_arg(a, uint64);
- decades = va_arg(a, uint32);
- va_end(a);
+ va_start(a, command);
+ minValue = va_arg(a, uint64);
+ decades = va_arg(a, uint32);
+ va_end(a);
- MXUserForceHisto(&stats->heldHisto, MXUSER_STAT_CLASS_HELD,
- minValue, decades);
-
- result = TRUE;
+ MXUserForceHisto(&stats->heldHisto, MXUSER_STAT_CLASS_HELD,
+ minValue, decades);
+
+ result = TRUE;
+ } else {
+ result = FALSE;
+ }
} else {
result = FALSE;
}
}
case MXUSER_CONTROL_ENABLE_STATS: {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
-
- if (LIKELY(stats == NULL)) {
+ if (vmx86_stats) {
+ MXUserStats *stats;
MXUserStats *before;
stats = Util_SafeCalloc(1, sizeof(*stats));
MXUserAcquisitionStatsSetUp(&stats->acquisitionStats);
MXUserBasicStatsSetUp(&stats->heldStats, MXUSER_STAT_CLASS_HELD);
- before = (MXUserStats *) Atomic_ReadIfEqualWritePtr(&lock->statsMem,
- NULL,
- (void *) stats);
+ before = Atomic_ReadIfEqualWritePtr(&lock->statsMem, NULL,
+ (void *) stats);
if (before) {
free(stats);
}
lock->header.statsFunc = MXUserStatsActionRec;
+
+ result = TRUE;
+ } else {
+ result = FALSE;
}
- result = TRUE;
break;
}
{
MXUserRecLock *lock = (MXUserRecLock *) header;
- Warning("%s: Recursive lock @ 0x%p\n", __FUNCTION__, lock);
+ Warning("%s: Recursive lock @ %p\n", __FUNCTION__, lock);
Warning("\tsignature 0x%X\n", lock->header.signature);
Warning("\tname %s\n", lock->header.name);
if (lock->vmmLock == NULL) {
Warning("\tcount %d\n", MXRecLockCount(&lock->recursiveLock));
- Warning("\taddress of owner data 0x%p\n",
+ Warning("\taddress of owner data %p\n",
&lock->recursiveLock.nativeThreadID);
} else {
- Warning("\tvmmLock 0x%p\n", lock->vmmLock);
+ Warning("\tvmmLock %p\n", lock->vmmLock);
}
}
MX_Rank rank, // IN:
Bool beSilent) // IN:
{
+ Bool doStats;
char *properName;
MXUserRecLock *lock;
lock->header.serialNumber = MXUserAllocSerialNumber();
lock->header.dumpFunc = MXUserDumpRecLock;
- if (beSilent || !MXUserStatsEnabled()) {
- lock->header.statsFunc = NULL;
- Atomic_WritePtr(&lock->statsMem, NULL);
+ if (beSilent) {
+ doStats = FALSE;
} else {
+ doStats = vmx86_stats && MXUserStatsEnabled();
+ }
+
+ if (doStats) {
MXUser_ControlRecLock(lock, MXUSER_CONTROL_ENABLE_STATS);
+ } else {
+ lock->header.statsFunc = NULL;
+ Atomic_WritePtr(&lock->statsMem, NULL);
}
MXUserAddToList(&lock->header);
if (Atomic_FetchAndDec(&lock->refCount) == 1) {
if (lock->vmmLock == NULL) {
- MXUserStats *stats;
-
if (MXRecLockCount(&lock->recursiveLock) > 0) {
MXUserDumpAndPanic(&lock->header,
"%s: Destroy of an acquired recursive lock\n",
MXUserRemoveFromList(&lock->header);
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
- MXUserBasicStatsTearDown(&stats->heldStats);
- MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
- MXUserHistoTearDown(Atomic_ReadPtr(&stats->heldHisto));
+ if (LIKELY(stats != NULL)) {
+ MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
+ MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
- free(stats);
+ MXUserBasicStatsTearDown(&stats->heldStats);
+ MXUserHistoTearDown(Atomic_ReadPtr(&stats->heldHisto));
+
+ free(stats);
+ }
}
}
ASSERT(MXUserMX_LockRec);
(*MXUserMX_LockRec)(lock->vmmLock);
} else {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
-
/* Rank checking is only done on the first acquisition */
MXUserAcquisitionTracking(&lock->header, TRUE);
- if (stats) {
- VmTimeType value = 0;
+ if (vmx86_stats) {
+ Bool contended;
+ VmTimeType start = 0;
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- MXRecLockAcquire(&lock->recursiveLock, &value);
+ if (LIKELY(stats != NULL)) {
+ start = Hostinfo_SystemTimerNS();
+ }
- if (MXRecLockCount(&lock->recursiveLock) == 1) {
- MXUserHisto *histo;
+ contended = MXRecLockAcquire(&lock->recursiveLock);
- MXUserAcquisitionSample(&stats->acquisitionStats,
- TRUE,
- value != 0, // True if contended
- value);
+ if (LIKELY(stats != NULL)) {
+ if (MXRecLockCount(&lock->recursiveLock) == 1) {
+ MXUserHisto *histo;
+ VmTimeType value = Hostinfo_SystemTimerNS() - start;
- histo = Atomic_ReadPtr(&stats->acquisitionHisto);
+ MXUserAcquisitionSample(&stats->acquisitionStats, TRUE,
+ contended, value);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, value, GetReturnAddress());
- }
+ histo = Atomic_ReadPtr(&stats->acquisitionHisto);
- stats->holdStart = Hostinfo_SystemTimerNS();
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, value, GetReturnAddress());
+ }
+
+ stats->holdStart = Hostinfo_SystemTimerNS();
+ }
}
} else {
- MXRecLockAcquire(&lock->recursiveLock,
- NULL); /* non-stats */
+ MXRecLockAcquire(&lock->recursiveLock);
}
}
ASSERT(MXUserMX_UnlockRec);
(*MXUserMX_UnlockRec)(lock->vmmLock);
} else {
- MXUserStats *stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- if (MXRecLockCount(&lock->recursiveLock) == 1) {
- VmTimeType value = Hostinfo_SystemTimerNS() - stats->holdStart;
- MXUserHisto *histo = Atomic_ReadPtr(&stats->heldHisto);
+ if (LIKELY(stats != NULL)) {
+ if (MXRecLockCount(&lock->recursiveLock) == 1) {
+ VmTimeType value = Hostinfo_SystemTimerNS() - stats->holdStart;
+ MXUserHisto *histo = Atomic_ReadPtr(&stats->heldHisto);
- MXUserBasicStatsSample(&stats->heldStats, value);
+ MXUserBasicStatsSample(&stats->heldStats, value);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, value, GetReturnAddress());
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, value, GetReturnAddress());
+ }
}
}
}
ASSERT(MXUserMX_TryLockRec);
success = (*MXUserMX_TryLockRec)(lock->vmmLock);
} else {
- MXUserStats *stats;
-
if (MXUserTryAcquireFail(lock->header.name)) {
success = FALSE;
goto bail;
MXUserAcquisitionTracking(&lock->header, FALSE);
}
- stats = (MXUserStats *) Atomic_ReadPtr(&lock->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (stats) {
- MXUserAcquisitionSample(&stats->acquisitionStats, success,
- !success, 0ULL);
+ if (LIKELY(stats != NULL)) {
+ MXUserAcquisitionSample(&stats->acquisitionStats, success,
+ !success, 0ULL);
+ }
}
}
ASSERT(lockStorage);
- lock = (MXUserRecLock *) Atomic_ReadPtr(lockStorage);
+ lock = Atomic_ReadPtr(lockStorage);
if (UNLIKELY(lock == NULL)) {
MXUserRecLock *newLock = MXUser_CreateRecLock(name, rank);
- lock = (MXUserRecLock *) Atomic_ReadIfEqualWritePtr(lockStorage, NULL,
- (void *) newLock);
+ lock = Atomic_ReadIfEqualWritePtr(lockStorage, NULL, (void *) newLock);
if (lock) {
MXUser_DestroyRecLock(newLock);
} else {
- lock = (MXUserRecLock *) Atomic_ReadPtr(lockStorage);
+ lock = Atomic_ReadPtr(lockStorage);
}
}
{
MXUserSemaphore *sema = (MXUserSemaphore *) header;
- Warning("%s: semaphore @ 0x%p\n", __FUNCTION__, sema);
+ Warning("%s: semaphore @ %p\n", __FUNCTION__, sema);
Warning("\tsignature 0x%X\n", sema->header.signature);
Warning("\tname %s\n", sema->header.name);
Warning("\tserial number %u\n", sema->header.serialNumber);
Warning("\treference count %u\n", Atomic_Read(&sema->activeUserCount));
- Warning("\taddress of native semaphore 0x%p\n", &sema->nativeSemaphore);
+ Warning("\taddress of native semaphore %p\n", &sema->nativeSemaphore);
}
}
if (LIKELY(MXUserInit(&sema->nativeSemaphore) == 0)) {
+ Bool doStats;
MXUserStats *stats;
sema->header.signature = MXUserGetSignature(MXUSER_TYPE_SEMA);
sema->header.serialNumber = MXUserAllocSerialNumber();
sema->header.dumpFunc = MXUserDumpSemaphore;
- if (MXUserStatsEnabled()) {
+ if (vmx86_stats) {
+ doStats = MXUserStatsEnabled();
+ } else {
+ doStats = FALSE;
+ }
+
+ if (doStats) {
sema->header.statsFunc = MXUserStatsActionSema;
stats = Util_SafeCalloc(1, sizeof(*stats));
{
if (LIKELY(sema != NULL)) {
int err;
- MXUserStats *stats;
MXUserValidateHeader(&sema->header, MXUSER_TYPE_SEMA);
__FUNCTION__);
}
+ sema->header.signature = 0; // 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);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&sema->statsMem);
- if (stats) {
- MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
- MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
+ if (LIKELY(stats != NULL)) {
+ MXUserAcquisitionStatsTearDown(&stats->acquisitionStats);
+ MXUserHistoTearDown(Atomic_ReadPtr(&stats->acquisitionHisto));
- free(stats);
+ free(stats);
+ }
}
free(sema->header.name);
MXUser_DownSemaphore(MXUserSemaphore *sema) // IN/OUT:
{
int err;
- MXUserStats *stats;
ASSERT(sema);
MXUserValidateHeader(&sema->header, MXUSER_TYPE_SEMA);
MXUserAcquisitionTracking(&sema->header, TRUE); // rank checking
- stats = (MXUserStats *) Atomic_ReadPtr(&sema->statsMem);
-
- if (stats) {
+ if (vmx86_stats) {
+ VmTimeType start = 0;
Bool tryDownSuccess = FALSE;
- VmTimeType begin = Hostinfo_SystemTimerNS();
+ MXUserStats *stats = Atomic_ReadPtr(&sema->statsMem);
+
+ if (LIKELY(stats != NULL)) {
+ start = Hostinfo_SystemTimerNS();
+ }
err = MXUserTryDown(&sema->nativeSemaphore, &tryDownSuccess);
if (!tryDownSuccess) {
err = MXUserDown(&sema->nativeSemaphore);
}
+ }
- if (LIKELY(err == 0)) {
- MXUserHisto *histo;
- VmTimeType value = Hostinfo_SystemTimerNS() - begin;
+ if (LIKELY((err == 0) && (stats != NULL))) {
+ MXUserHisto *histo;
+ VmTimeType value = Hostinfo_SystemTimerNS() - start;
- MXUserAcquisitionSample(&stats->acquisitionStats, TRUE,
- !tryDownSuccess, value);
+ MXUserAcquisitionSample(&stats->acquisitionStats, TRUE,
+ !tryDownSuccess, value);
- histo = Atomic_ReadPtr(&stats->acquisitionHisto);
+ histo = Atomic_ReadPtr(&stats->acquisitionHisto);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, value, GetReturnAddress());
- }
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, value, GetReturnAddress());
}
}
} else {
uint32 msecWait) // IN:
{
int err;
- MXUserStats *stats;
Bool downOccurred = FALSE;
ASSERT(sema);
MXUserAcquisitionTracking(&sema->header, TRUE); // rank checking
- stats = (MXUserStats *) Atomic_ReadPtr(&sema->statsMem);
-
- if (stats) {
+ if (vmx86_stats) {
+ VmTimeType start = 0;
Bool tryDownSuccess = FALSE;
- VmTimeType begin = Hostinfo_SystemTimerNS();
+ MXUserStats *stats = Atomic_ReadPtr(&sema->statsMem);
+
+ if (LIKELY(stats != NULL)) {
+ start = Hostinfo_SystemTimerNS();
+ }
err = MXUserTryDown(&sema->nativeSemaphore, &tryDownSuccess);
err = MXUserTimedDown(&sema->nativeSemaphore, msecWait,
&downOccurred);
}
+ }
- if (LIKELY(err == 0)) {
- VmTimeType value = Hostinfo_SystemTimerNS() - begin;
+ if (LIKELY((err == 0) && (stats != NULL))) {
+ VmTimeType value = Hostinfo_SystemTimerNS() - start;
- MXUserAcquisitionSample(&stats->acquisitionStats, downOccurred,
- !tryDownSuccess, value);
+ MXUserAcquisitionSample(&stats->acquisitionStats, downOccurred,
+ !tryDownSuccess, value);
- if (downOccurred) {
- MXUserHisto *histo = Atomic_ReadPtr(&stats->acquisitionHisto);
+ if (downOccurred) {
+ MXUserHisto *histo = Atomic_ReadPtr(&stats->acquisitionHisto);
- if (UNLIKELY(histo != NULL)) {
- MXUserHistoSample(histo, value, GetReturnAddress());
- }
+ if (UNLIKELY(histo != NULL)) {
+ MXUserHistoSample(histo, value, GetReturnAddress());
}
}
}
MXUser_TryDownSemaphore(MXUserSemaphore *sema) // IN/OUT:
{
int err;
- MXUserStats *stats;
Bool downOccurred = FALSE;
ASSERT(sema);
__FUNCTION__, err);
}
- stats = (MXUserStats *) Atomic_ReadPtr(&sema->statsMem);
+ if (vmx86_stats) {
+ MXUserStats *stats = Atomic_ReadPtr(&sema->statsMem);
- if (stats) {
- MXUserAcquisitionSample(&stats->acquisitionStats, downOccurred,
- !downOccurred, 0ULL);
+ if (LIKELY(stats != NULL)) {
+ MXUserAcquisitionSample(&stats->acquisitionStats, downOccurred,
+ !downOccurred, 0ULL);
+ }
}
Atomic_Dec(&sema->activeUserCount);
ASSERT(semaStorage);
- sema = (MXUserSemaphore *) Atomic_ReadPtr(semaStorage);
+ sema = Atomic_ReadPtr(semaStorage);
if (UNLIKELY(sema == NULL)) {
MXUserSemaphore *newSema = MXUser_CreateSemaphore(name, rank);
- sema = (MXUserSemaphore *) Atomic_ReadIfEqualWritePtr(semaStorage,
- NULL,
- (void *) newSema);
+ sema = Atomic_ReadIfEqualWritePtr(semaStorage, NULL, (void *) newSema);
if (sema) {
MXUser_DestroySemaphore(newSema);
} else {
- sema = (MXUserSemaphore *) Atomic_ReadPtr(semaStorage);
+ sema = Atomic_ReadPtr(semaStorage);
}
}
/* Tolerate a failure. This is too low down to log */
if (listLock) {
- MXRecLockAcquire(listLock,
- NULL); // non-stats
+ MXRecLockAcquire(listLock);
LIST_QUEUE(&header->item, &mxUserLockList);
MXRecLockRelease(listLock);
}
/* Tolerate a failure. This is too low down to log */
if (listLock) {
- MXRecLockAcquire(listLock,
- NULL); // non-stats
+ MXRecLockAcquire(listLock);
LIST_DEL(&header->item, &mxUserLockList);
MXRecLockRelease(listLock);
}