/*********************************************************
- * Copyright (C) 2009-2017 VMware, Inc. All rights reserved.
+ * Copyright (C) 2009-2018 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
header = perThread->lockArray[i];
node = MXUserLockTreeAdd(node, header->name,
- header->bits.serialNumber, header->rank);
+ header->serialNumber, header->rank);
}
MXUserLockTreeRelease();
{
uint32 expected = MXUserGetSignature(objectType);
- if (header->bits.badHeader == 1) {
+ if (header->badHeader) {
return; // No need to panic on a bad header repeatedly...
}
if (header->signature != expected) {
- header->bits.badHeader = 1;
+ header->badHeader = TRUE;
MXUserDumpAndPanic(header,
"%s: signature failure! expected 0x%X observed 0x%X\n",
}
- if (header->bits.serialNumber == 0) {
- header->bits.badHeader = 1;
+ if (header->serialNumber == 0) {
+ header->badHeader = TRUE;
MXUserDumpAndPanic(header, "%s: Invalid serial number!\n",
__FUNCTION__);
/*********************************************************
- * Copyright (C) 2010-2016 VMware, Inc. All rights reserved.
+ * Copyright (C) 2010-2018 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
Warning("\tsignature 0x%X\n", barrier->header.signature);
Warning("\tname %s\n", barrier->header.name);
Warning("\trank 0x%X\n", barrier->header.rank);
- Warning("\tserial number %u\n", barrier->header.bits.serialNumber);
+ Warning("\tserial number %"FMT64"u\n", barrier->header.serialNumber);
Warning("\tlock 0x%p\n", barrier->lock);
Warning("\tconfigured count %u\n", barrier->configCount);
barrier->header.signature = MXUserGetSignature(MXUSER_TYPE_BARRIER);
barrier->header.name = properName;
barrier->header.rank = rank;
- barrier->header.bits.serialNumber = MXUserAllocSerialNumber();
+ barrier->header.serialNumber = MXUserAllocSerialNumber();
barrier->header.dumpFunc = MXUserDumpBarrier;
barrier->header.statsFunc = NULL;
/*********************************************************
- * Copyright (C) 2009-2017 VMware, Inc. All rights reserved.
+ * Copyright (C) 2009-2018 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
Warning("\tsignature 0x%X\n", lock->header.signature);
Warning("\tname %s\n", lock->header.name);
Warning("\trank 0x%X\n", lock->header.rank);
- Warning("\tserial number %u\n", lock->header.bits.serialNumber);
+ Warning("\tserial number %"FMT64"u\n", lock->header.serialNumber);
Warning("\tlock count %d\n", MXRecLockCount(&lock->recursiveLock));
lock->header.signature = MXUserGetSignature(MXUSER_TYPE_EXCL);
lock->header.name = properName;
lock->header.rank = rank;
- lock->header.bits.serialNumber = MXUserAllocSerialNumber();
+ lock->header.serialNumber = MXUserAllocSerialNumber();
lock->header.dumpFunc = MXUserDumpExclLock;
statsMode = MXUserStatsMode();
*/
typedef struct MXUserHeader {
- uint32 signature;
char *name;
+ uint32 signature;
MX_Rank rank;
- struct {
- unsigned int serialNumber : 24;
- unsigned int badHeader: 1;
- } bits;
-
void (*dumpFunc)(struct MXUserHeader *);
void (*statsFunc)(struct MXUserHeader *);
ListItem item;
+
+ uint64 serialNumber;
+ Bool badHeader;
} MXUserHeader;
Atomic_Ptr histo;
} MXUserHeldStats;
-uint32 MXUserAllocSerialNumber(void);
+uint64 MXUserAllocSerialNumber(void);
void MXUserAddToList(MXUserHeader *header);
void MXUserRemoveFromList(MXUserHeader *header);
/*********************************************************
- * Copyright (C) 2010-2016 VMware, Inc. All rights reserved.
+ * Copyright (C) 2010-2018 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
MXUserLockTreeNode *MXUserLockTreeAdd(MXUserLockTreeNode *searchNode,
const char *name,
- uint32 serialNumber,
+ uint64 serialNumber,
MX_Rank rank);
#endif
/*********************************************************
- * Copyright (C) 2009-2017 VMware, Inc. All rights reserved.
+ * Copyright (C) 2009-2018 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
Warning("\tsignature 0x%X\n", lock->header.signature);
Warning("\tname %s\n", lock->header.name);
Warning("\trank 0x%X\n", lock->header.rank);
- Warning("\tserial number %u\n", lock->header.bits.serialNumber);
+ Warning("\tserial number %"FMT64"u\n", lock->header.serialNumber);
if (LIKELY(lock->useNative)) {
Warning("\taddress of native lock 0x%p\n", &lock->nativeLock);
lock->header.signature = MXUserGetSignature(MXUSER_TYPE_RW);
lock->header.name = properName;
lock->header.rank = rank;
- lock->header.bits.serialNumber = MXUserAllocSerialNumber();
+ lock->header.serialNumber = MXUserAllocSerialNumber();
lock->header.dumpFunc = MXUserDumpRWLock;
/*
/*********************************************************
- * Copyright (C) 2009-2017 VMware, Inc. All rights reserved.
+ * Copyright (C) 2009-2018 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
Warning("\tsignature 0x%X\n", lock->header.signature);
Warning("\tname %s\n", lock->header.name);
Warning("\trank 0x%X\n", lock->header.rank);
- Warning("\tserial number %u\n", lock->header.bits.serialNumber);
+ Warning("\tserial number %"FMT64"u\n", lock->header.serialNumber);
Warning("\treference count %u\n", Atomic_Read(&lock->refCount));
if (lock->vmmLock == NULL) {
lock->header.signature = MXUserGetSignature(MXUSER_TYPE_REC);
lock->header.name = properName;
lock->header.rank = rank;
- lock->header.bits.serialNumber = MXUserAllocSerialNumber();
+ lock->header.serialNumber = MXUserAllocSerialNumber();
lock->header.dumpFunc = MXUserDumpRecLock;
statsMode = MXUserStatsMode();
}
lock->header.rank = rank;
- lock->header.bits.serialNumber = MXUserAllocSerialNumber();
+ lock->header.serialNumber = MXUserAllocSerialNumber();
lock->header.dumpFunc = NULL;
lock->header.statsFunc = NULL;
/*********************************************************
- * Copyright (C) 2010-2017 VMware, Inc. All rights reserved.
+ * Copyright (C) 2010-2018 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
Warning("\tsignature 0x%X\n", sema->header.signature);
Warning("\tname %s\n", sema->header.name);
Warning("\trank 0x%X\n", sema->header.rank);
- Warning("\tserial number %u\n", sema->header.bits.serialNumber);
+ Warning("\tserial number %"FMT64"u\n", sema->header.serialNumber);
Warning("\treference count %u\n", Atomic_Read(&sema->activeUserCount));
Warning("\taddress of native semaphore %p\n", &sema->nativeSemaphore);
sema->header.signature = MXUserGetSignature(MXUSER_TYPE_SEMA);
sema->header.name = properName;
sema->header.rank = rank;
- sema->header.bits.serialNumber = MXUserAllocSerialNumber();
+ sema->header.serialNumber = MXUserAllocSerialNumber();
sema->header.dumpFunc = MXUserDumpSemaphore;
statsMode = MXUserStatsMode();
ASSERT(mxUserHistoLine != NULL);
i = Str_Sprintf(mxUserHistoLine, mxUserMaxLineLength,
- "MXUser: h l=%u t=%s min=%"FMT64"u max=%"FMT64"u\n",
- header->bits.serialNumber, histo->typeName,
+ "MXUser: h l=%"FMT64"u t=%s min=%"FMT64"u "
+ "max=%"FMT64"u\n",
+ header->serialNumber, histo->typeName,
histo->minValue, histo->maxValue);
/*
stdDev = (variance < 0.0) ? 0 : (uint64) (MXUserSqrt(variance) + 0.5);
}
- MXUserStatsLog("MXUser: e l=%u t=%s c=%"FMT64"u min=%"FMT64"u "
+ MXUserStatsLog("MXUser: e l=%"FMT64"u t=%s c=%"FMT64"u min=%"FMT64"u "
"max=%"FMT64"u mean=%"FMT64"u sd=%"FMT64"u\n",
- header->bits.serialNumber, stats->typeName,
+ header->serialNumber, stats->typeName,
stats->numSamples, stats->minTime, stats->maxTime,
stats->timeSum/stats->numSamples, stdDev);
}
MXUserDumpBasicStats(&stats->basicStats, header);
}
- MXUserStatsLog("MXUser: ce l=%u a=%"FMT64"u s=%"FMT64"u sc=%"FMT64"u "
- "sct=%"FMT64"u t=%"FMT64"u\n",
- header->bits.serialNumber,
+ MXUserStatsLog("MXUser: ce l=%"FMT64"u a=%"FMT64"u s=%"FMT64"u "
+ "sc=%"FMT64"u sct=%"FMT64"u t=%"FMT64"u\n",
+ header->serialNumber,
stats->numAttempts,
stats->numSuccesses,
stats->numSuccessesContended,
if (listLock && MXRecLockTryAcquire(listLock)) {
ListItem *entry;
- uint32 highestSerialNumber;
- static uint32 lastReportedSerialNumber = 0;
+ uint64 highestSerialNumber;
+ static uint64 lastReportedSerialNumber = 0;
highestSerialNumber = lastReportedSerialNumber;
MXUserHeader *header = CIRC_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->serialNumber > lastReportedSerialNumber) {
+ MXUserStatsLog("MXUser: n n=%s l=%"FMT64"u r=0x%x\n", header->name,
+ header->serialNumber, header->rank);
- if (header->bits.serialNumber > highestSerialNumber) {
- highestSerialNumber = header->bits.serialNumber;
+ if (header->serialNumber > highestSerialNumber) {
+ highestSerialNumber = header->serialNumber;
}
}
*-----------------------------------------------------------------------------
*/
-uint32
+uint64
MXUserAllocSerialNumber(void)
{
- uint32 value;
-
- static Atomic_uint32 firstFreeSerialNumber = { 1 }; // must start not zero
+ uint64 value;
- value = Atomic_ReadInc32(&firstFreeSerialNumber);
+ static Atomic_uint64 firstFreeSerialNumber = { 1 }; // must start not zero
- /*
- * The serial number must be able to fit into the serial number field
- * (see ulInt.h).
- */
+ value = Atomic_ReadInc64(&firstFreeSerialNumber);
- if (value > 0xFFFFFF) {
+ if (value == 0) { // We wrapped! Zounds!
Panic("%s: too many locks!\n", __FUNCTION__);
}