/*++ Copyright (c) 1999-2000 Microsoft Corporation Module Name: dbglocks.cxx Abstract: Locks support Author: George V. Reilly (GeorgeRe) 01-Mar-1999 Revision History: --*/ #include "precomp.hxx" #ifdef LOCK_INSTRUMENTATION # define LOCK_DEFAULT_NAME ("lkrdbg") LONG CSmallSpinLock::sm_cTotalLocks = 0; LONG CSpinLock::sm_cTotalLocks = 0; LONG CReaderWriterLock::sm_cTotalLocks = 0; LONG CReaderWriterLock2::sm_cTotalLocks = 0; LONG CReaderWriterLock3::sm_cTotalLocks = 0; LONG CReaderWriterLock4::sm_cTotalLocks = 0; #else // !LOCK_INSTRUMENTATION # define LOCK_DEFAULT_NAME #endif // !LOCK_INSTRUMENTATION const char* LockName( LOCK_LOCKTYPE lt) { const char* pszName = NULL; static char szName[40]; switch (lt) { case LOCK_FAKELOCK: pszName = "CFakeLock"; break; case LOCK_SMALLSPINLOCK: pszName = "CSmallSpinLock"; break; case LOCK_SPINLOCK: pszName = "CSpinLock"; break; case LOCK_CRITSEC: pszName = "CCritSec"; break; case LOCK_READERWRITERLOCK: pszName = "CReaderWriterLock"; break; case LOCK_READERWRITERLOCK2: pszName = "CReaderWriterLock2"; break; case LOCK_READERWRITERLOCK3: pszName = "CReaderWriterLock3"; break; case LOCK_READERWRITERLOCK4: pszName = "CReaderWriterLock4"; break; #ifdef LOCKS_KERNEL_MODE case LOCK_KSPINLOCK: pszName = "CKSpinLock"; break; case LOCK_FASTMUTEX: pszName = "CFastMutex"; break; case LOCK_ERESOURCE: pszName = "CEResource"; break; case LOCK_RTL_MRSW_LOCK: pszName = "CRtlMrswLock"; break; #endif // LOCKS_KERNEL_MODE default: sprintf(szName, "UnknownLockType %d", lt); pszName = szName; break; } return pszName; }; int LockSize( LOCK_LOCKTYPE lt) { int cb = 0; switch (lt) { case LOCK_FAKELOCK: cb = sizeof(CFakeLock); break; case LOCK_SMALLSPINLOCK: cb = sizeof(CSmallSpinLock); break; case LOCK_SPINLOCK: cb = sizeof(CSpinLock); break; case LOCK_CRITSEC: cb = sizeof(CCritSec); break; case LOCK_READERWRITERLOCK: cb = sizeof(CReaderWriterLock); break; case LOCK_READERWRITERLOCK2: cb = sizeof(CReaderWriterLock2); break; case LOCK_READERWRITERLOCK3: cb = sizeof(CReaderWriterLock3); break; case LOCK_READERWRITERLOCK4: cb = sizeof(CReaderWriterLock4); break; #ifdef LOCKS_KERNEL_MODE case LOCK_KSPINLOCK: cb = sizeof(CKSpinLock); break; case LOCK_FASTMUTEX: cb = sizeof(CFastMutex); break; case LOCK_ERESOURCE: cb = sizeof(CEResource); break; case LOCK_RTL_MRSW_LOCK: cb = sizeof(CRtlMrswLock); break; #endif // LOCKS_KERNEL_MODE default: cb = 0; break; } return cb; }; BOOL Print_FakeLock( IN PVOID pvLock, IN INT nVerbose) { return TRUE; } BOOL Print_SmallSpinLock( IN PVOID pvLock, IN INT nVerbose) { CSmallSpinLock sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CSmallSpinLock (%p): Thread = %x\n", pvLock, sl.m_lTid); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_SpinLock( IN PVOID pvLock, IN INT nVerbose) { CSpinLock sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CSpinLock (%p): Thread = %d, Count = %d\n", pvLock, (sl.m_lTid & CSpinLock::SL_THREAD_MASK) >> CSpinLock::SL_THREAD_SHIFT, (sl.m_lTid & CSpinLock::SL_OWNER_MASK) >> CSpinLock::SL_OWNER_SHIFT); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_CritSec( IN PVOID pvLock, IN INT nVerbose) { return TRUE; } BOOL Print_ReaderWriterLock( IN PVOID pvLock, IN INT nVerbose) { CReaderWriterLock sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CReaderWriterLock (%p): State = %x, Waiters = %d\n", pvLock, sl.m_nState, sl.m_cWaiting); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_ReaderWriterLock2( IN PVOID pvLock, IN INT nVerbose) { CReaderWriterLock2 sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CReaderWriterLock2 (%p): State = %x, Waiters = %d\n", pvLock, (sl.m_lRW & CReaderWriterLock2::SL_STATE_MASK) >> CReaderWriterLock2::SL_STATE_SHIFT, (sl.m_lRW & CReaderWriterLock2::SL_WAITING_MASK) >> CReaderWriterLock2::SL_WAITING_SHIFT ); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_ReaderWriterLock3( IN PVOID pvLock, IN INT nVerbose) { CReaderWriterLock3 sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); int nReaders = ((sl.m_lRW & CReaderWriterLock3::SL_STATE_MASK) >> CReaderWriterLock3::SL_STATE_SHIFT); dprintf("CReaderWriterLock3 (%p): State = %x, Readers = %d, Waiters = %d, " "Thrd = %x, Cnt = %d\n", pvLock, (sl.m_lRW & CReaderWriterLock3::SL_STATE_MASK) >> CReaderWriterLock3::SL_STATE_SHIFT, nReaders == CReaderWriterLock3::SL_EXCLUSIVE ? 0 : nReaders, (sl.m_lRW & CReaderWriterLock3::SL_WAITING_MASK) >> CReaderWriterLock3::SL_WAITING_SHIFT, (sl.m_lTid & CReaderWriterLock3::SL_THREAD_MASK) >> CReaderWriterLock3::SL_THREAD_SHIFT, (sl.m_lTid & CReaderWriterLock3::SL_OWNER_MASK) >> CReaderWriterLock3::SL_OWNER_SHIFT ); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_ReaderWriterLock4( IN PVOID pvLock, IN INT nVerbose) { CReaderWriterLock4 sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); int nRW = (short) ((sl.m_lRW & CReaderWriterLock4::SL_STATE_MASK) >> CReaderWriterLock4::SL_STATE_SHIFT); int nWriterRecursion = ((sl.m_lRW & CReaderWriterLock4::SL_STATE_MASK) >> CReaderWriterLock4::SL_STATE_SHIFT); dprintf("CReaderWriterLock4 (%p): RW=%08x, Tid=%x - State = %x, " "Readers = %d, Waiters = %d, Thrd = %x, Cnt = %d\n", pvLock, (sl.m_lRW & CReaderWriterLock4::SL_STATE_MASK) >> CReaderWriterLock4::SL_STATE_SHIFT, nRW < 0 ? 0 : nRW, (sl.m_lRW & CReaderWriterLock4::SL_WAITING_MASK) >> CReaderWriterLock4::SL_WAITING_SHIFT, (sl.m_lTid & CReaderWriterLock4::SL_THREAD_MASK) >> CReaderWriterLock4::SL_THREAD_SHIFT, nRW < 0 ? -nRW : 0 ); memset(&sl, 0, sizeof(sl)); return TRUE; } #ifdef LOCKS_KERNEL_MODE BOOL Print_KSpinLock( IN PVOID pvLock, IN INT nVerbose) { CKSpinLock sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CKSpinLock (%p): \n", pvLock); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_FastMutex( IN PVOID pvLock, IN INT nVerbose) { CFastMutex sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CFastMutex (%p): \n", pvLock); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_EResource( IN PVOID pvLock, IN INT nVerbose) { CEResource sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CEResource (%p): \n", pvLock); memset(&sl, 0, sizeof(sl)); return TRUE; } BOOL Print_RtlMrswLock( IN PVOID pvLock, IN INT nVerbose) { CRtlMrswLock sl LOCK_DEFAULT_NAME; ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CRtlMrswLock (%p): \n", pvLock); memset(&sl, 0, sizeof(sl)); return TRUE; } #endif // LOCKS_KERNEL_MODE BOOL PrintLock( LOCK_LOCKTYPE lt, IN PVOID pvLock, IN INT nVerbose) { BOOL f = FALSE; switch (lt) { case LOCK_FAKELOCK: f = Print_FakeLock(pvLock, nVerbose); break; case LOCK_SMALLSPINLOCK: f = Print_SmallSpinLock(pvLock, nVerbose); break; case LOCK_SPINLOCK: f = Print_SpinLock(pvLock, nVerbose); break; case LOCK_CRITSEC: f = Print_CritSec(pvLock, nVerbose); break; case LOCK_READERWRITERLOCK: f = Print_ReaderWriterLock(pvLock, nVerbose); break; case LOCK_READERWRITERLOCK2: f = Print_ReaderWriterLock2(pvLock, nVerbose); break; case LOCK_READERWRITERLOCK3: f = Print_ReaderWriterLock3(pvLock, nVerbose); break; case LOCK_READERWRITERLOCK4: f = Print_ReaderWriterLock4(pvLock, nVerbose); break; #ifdef LOCKS_KERNEL_MODE case LOCK_KSPINLOCK: f = Print_KSpinLock(pvLock, nVerbose); break; case LOCK_FASTMUTEX: f = Print_FastMutex(pvLock, nVerbose); break; case LOCK_ERESOURCE: f = Print_EResource(pvLock, nVerbose); break; case LOCK_RTL_MRSW_LOCK: f = Print_RtlMrswLock(pvLock, nVerbose); break; #endif // LOCKS_KERNEL_MODE default: f = FALSE; break; } return f; }