Now that the big change is in, reapply this change.
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
ASSERT(perThreadLock);
- MXRecLockAcquire(perThreadLock);
+ MXRecLockAcquire(perThreadLock,
+ NULL); // non-stats
if (perThreadFreeList == NULL) {
perThread = Util_SafeMalloc(sizeof *perThread);
perThreadLock = MXUserInternalSingleton(&perThreadLockMem);
ASSERT(perThreadLock);
- MXRecLockAcquire(perThreadLock);
+ MXRecLockAcquire(perThreadLock,
+ NULL); // non-stats
perThread->next = perThreadFreeList;
perThreadFreeList = perThread;
MXRecLockRelease(perThreadLock);
LeaveCriticalSection(&condVar->x.compat.condVarLock);
} while (!done);
- MXRecLockAcquire(lock);
+ MXRecLockAcquire(lock,
+ NULL); // non-stats
MXRecLockIncCount(lock, lockCount - 1);
MXUserAcquisitionTracking(&lock->header, TRUE);
if (vmx86_stats) {
- Bool contended;
- VmTimeType start = 0;
+ VmTimeType value = 0;
MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (LIKELY(stats != NULL)) {
- start = Hostinfo_SystemTimerNS();
- }
-
- contended = MXRecLockAcquire(&lock->recursiveLock);
+ MXRecLockAcquire(&lock->recursiveLock, (stats == NULL) ? NULL : &value);
if (LIKELY(stats != NULL)) {
MXUserHisto *histo;
- VmTimeType value = Hostinfo_SystemTimerNS() - start;
- MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended,
+ MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, value != 0,
value);
histo = Atomic_ReadPtr(&stats->acquisitionHisto);
stats->holdStart = Hostinfo_SystemTimerNS();
}
} else {
- MXRecLockAcquire(&lock->recursiveLock);
+ MXRecLockAcquire(&lock->recursiveLock,
+ NULL); // non-stats
}
if (vmx86_debug && (MXRecLockCount(&lock->recursiveLock) > 1)) {
#include "vm_basic_types.h"
#include "vthreadBase.h"
+#include "hostinfo.h"
#include "circList.h"
MXRecLockIncCount(MXRecLock *lock, // IN/OUT:
int count) // IN:
{
- ASSERT(count > 0);
+ ASSERT(count >= 0);
if (MXRecLockCount(lock) == 0) {
MXRecLockSetOwner(lock);
}
-static INLINE Bool
-MXRecLockAcquire(MXRecLock *lock) // IN/OUT:
+static INLINE void
+MXRecLockAcquire(MXRecLock *lock, // IN/OUT:
+ VmTimeType *duration) // OUT/OPT:
{
int err;
+ VmTimeType start = 0;
if ((MXRecLockCount(lock) > 0) && MXRecLockIsOwner(lock)) {
MXRecLockIncCount(lock, 1);
- return FALSE; // Not contended
+ if (duration != NULL) {
+ *duration = 0ULL;
+ }
+
+ return; // Uncontended
}
err = MXRecLockTryAcquireInternal(lock);
if (err == 0) {
MXRecLockIncCount(lock, 1);
- return FALSE; // Not contended
+ if (duration != NULL) {
+ *duration = 0ULL;
+ }
+
+ return; // Uncontended
}
if (vmx86_debug && (err != EBUSY)) {
Panic("%s: MXRecLockTryAcquireInternal error %d\n", __FUNCTION__, err);
}
+ if (duration != NULL) {
+ start = Hostinfo_SystemTimerNS();
+ }
+
err = MXRecLockAcquireInternal(lock);
+ if (duration != NULL) {
+ *duration = Hostinfo_SystemTimerNS() - start;
+ }
+
if (vmx86_debug && (err != 0)) {
Panic("%s: MXRecLockAcquireInternal error %d\n", __FUNCTION__, err);
}
MXRecLockIncCount(lock, 1);
- return TRUE; // Contended
+ return; // Contended
}
MXRecLockDecCount(MXRecLock *lock, // IN/OUT:
int count) // IN:
{
- ASSERT(count > 0);
+ ASSERT(count >= 0);
lock->referenceCount -= count;
}
if (vmx86_stats) {
- Bool contended;
- VmTimeType start = 0;
+ VmTimeType value;
MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- 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 {
- contended = MXRecLockAcquire(&lock->recursiveLock);
+ value = 0;
+
+ MXRecLockAcquire(&lock->recursiveLock,
+ (stats == NULL) ? NULL : &value);
}
if (LIKELY(stats != NULL)) {
MXUserHisto *histo;
- VmTimeType value = Hostinfo_SystemTimerNS() - start;
/*
* The statistics are not atomically safe so protect them when
*/
if (forRead && lock->useNative) {
- MXRecLockAcquire(&lock->recursiveLock);
+ MXRecLockAcquire(&lock->recursiveLock,
+ NULL); // non-stats
}
- MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended,
+ MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, value != 0,
value);
histo = Atomic_ReadPtr(&stats->acquisitionHisto);
__FUNCTION__, err);
}
} else {
- MXRecLockAcquire(&lock->recursiveLock);
+ MXRecLockAcquire(&lock->recursiveLock,
+ NULL); // non-stats
}
}
*/
if ((myContext->state == RW_LOCKED_FOR_READ) && lock->useNative) {
- MXRecLockAcquire(&lock->recursiveLock);
+ MXRecLockAcquire(&lock->recursiveLock,
+ NULL); // non-stats
}
MXUserBasicStatsSample(&stats->heldStats, duration);
MXUserAcquisitionTracking(&lock->header, TRUE);
if (vmx86_stats) {
- Bool contended;
- VmTimeType start = 0;
+ VmTimeType value = 0;
MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
- if (LIKELY(stats != NULL)) {
- start = Hostinfo_SystemTimerNS();
- }
-
- contended = MXRecLockAcquire(&lock->recursiveLock);
+ MXRecLockAcquire(&lock->recursiveLock,
+ (stats == NULL) ? NULL : &value);
if (LIKELY(stats != NULL)) {
if (MXRecLockCount(&lock->recursiveLock) == 1) {
MXUserHisto *histo;
- VmTimeType value = Hostinfo_SystemTimerNS() - start;
MXUserAcquisitionSample(&stats->acquisitionStats, TRUE,
- contended, value);
+ value != 0, value);
histo = Atomic_ReadPtr(&stats->acquisitionHisto);
}
}
} else {
- MXRecLockAcquire(&lock->recursiveLock);
+ MXRecLockAcquire(&lock->recursiveLock,
+ NULL); // non-stats
}
}
/* Tolerate a failure. This is too low down to log */
if (listLock) {
- MXRecLockAcquire(listLock);
+ MXRecLockAcquire(listLock,
+ NULL); // non-stats
LIST_QUEUE(&header->item, &mxUserLockList);
MXRecLockRelease(listLock);
}
/* Tolerate a failure. This is too low down to log */
if (listLock) {
- MXRecLockAcquire(listLock);
+ MXRecLockAcquire(listLock,
+ NULL); // non-stats
LIST_DEL(&header->item, &mxUserLockList);
MXRecLockRelease(listLock);
}