|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
dbglocks.cxx
Abstract:
Locks support
Author:
George V. Reilly (GeorgeRe) 01-Mar-1999
Revision History:
--*/
#include "inetdbgp.h"
#ifdef LOCK_INSTRUMENTATION
# define LOCK_DEFAULT_NAME ("inetdbg")
# ifdef LOCK_SMALL_SPIN_INSTRUMENTATION
LONG CSmallSpinLock::sm_cTotalLocks = 0; # endif
#ifdef TEST_LOCKS
LONG CSpinLock1::sm_cTotalLocks = 0; LONG CSpinLock2::sm_cTotalLocks = 0; #endif // TEST_LOCKS
LONG CSpinLock::sm_cTotalLocks = 0; LONG CReaderWriterLock::sm_cTotalLocks = 0; LONG CReaderWriterLock2::sm_cTotalLocks = 0; LONG CReaderWriterLock3::sm_cTotalLocks = 0; #else // !LOCK_INSTRUMENTATION
# define LOCK_DEFAULT_NAME
#endif // !LOCK_INSTRUMENTATION
const char* LockName( LOCK_LOCKTYPE lt) { const char* pszName = NULL;
switch (lt) { case LOCK_SMALLSPINLOCK: pszName = "CSmallSpinLock"; break; #ifdef TEST_LOCKS
case LOCK_SPINLOCK1: pszName = "CSpinLock1"; break; case LOCK_SPINLOCK2: pszName = "CSpinLock2"; break; #endif // TEST_LOCKS
case LOCK_SPINLOCK: pszName = "CSpinLock"; break; case LOCK_FAKELOCK: pszName = "CFakeLock"; break; case LOCK_CRITSEC: pszName = "CCritSec"; break; case LOCK_RTLRESOURCE: pszName = "CRtlResource"; break; case LOCK_SHARELOCK: pszName = "CShareLock"; break; case LOCK_READERWRITERLOCK: pszName = "CReaderWriterLock"; break; case LOCK_READERWRITERLOCK2: pszName = "CReaderWriterLock2"; break; case LOCK_READERWRITERLOCK3: pszName = "CReaderWriterLock3"; break; default: pszName = "UnknownLockType"; break; }
return pszName; };
int LockSize( LOCK_LOCKTYPE lt) { int cb = 0;
switch (lt) { case LOCK_SMALLSPINLOCK: cb = sizeof(CSmallSpinLock); break; #ifdef TEST_LOCKS
case LOCK_SPINLOCK1: cb = sizeof(CSpinLock1); break; case LOCK_SPINLOCK2: cb = sizeof(CSpinLock2); break; #endif // TEST_LOCKS
case LOCK_SPINLOCK: cb = sizeof(CSpinLock); break; case LOCK_FAKELOCK: cb = sizeof(CFakeLock); break; case LOCK_CRITSEC: cb = sizeof(CCritSec); break; case LOCK_RTLRESOURCE: cb = sizeof(CRtlResource); break; case LOCK_SHARELOCK: cb = sizeof(CShareLock); break; case LOCK_READERWRITERLOCK: cb = sizeof(CReaderWriterLock); break; case LOCK_READERWRITERLOCK2: cb = sizeof(CReaderWriterLock2); break; case LOCK_READERWRITERLOCK3: cb = sizeof(CReaderWriterLock3); break; default: cb = 0; break; }
return cb; };
BOOL Print_SmallSpinLock( IN PVOID pvLock, IN INT nVerbose) { #ifdef LOCK_SMALL_SPIN_INSTRUMENTATION
CSmallSpinLock sl LOCK_DEFAULT_NAME; #else // !LOCK_SMALL_SPIN_INSTRUMENTATION
CSmallSpinLock sl; #endif // !LOCK_SMALL_SPIN_INSTRUMENTATION
ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CSmallSpinLock (%p): Thread = %x\n", pvLock, sl.m_lTid);
return TRUE; }
#ifdef TEST_LOCKS
BOOL Print_SpinLock1( IN PVOID pvLock, IN INT nVerbose) { CSpinLock1 sl LOCK_DEFAULT_NAME;
ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CSpinLock1 (%p): ssl = %x, Thread = %hd, Owners = %d, RW = %d\n", pvLock, sl.m_ssl.m_lLock, sl.m_nThreadId, (int) sl.m_cOwners, (int) sl.m_nRWState);
return TRUE; }
BOOL Print_SpinLock2( IN PVOID pvLock, IN INT nVerbose) { CSpinLock2 sl LOCK_DEFAULT_NAME;
ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CSpinLock2 (%p): Thread = %hd, Count = %hd\n", pvLock, sl.m_data.m_nThreadId, sl.m_data.m_cOwners);
return TRUE; }
#endif // TEST_LOCKS
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::THREAD_MASK) >> CSpinLock::THREAD_SHIFT, (sl.m_lTid & CSpinLock::OWNER_MASK) >> CSpinLock::OWNER_SHIFT);
return TRUE; }
BOOL Print_FakeLock( IN PVOID pvLock, IN INT nVerbose) { return TRUE; }
BOOL Print_CritSec( IN PVOID pvLock, IN INT nVerbose) { return TRUE; }
BOOL Print_RtlResource( IN PVOID pvLock, IN INT nVerbose) { return TRUE; }
BOOL Print_ShareLock( 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);
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 );
return TRUE; }
BOOL Print_ReaderWriterLock3( IN PVOID pvLock, IN INT nVerbose) { CReaderWriterLock3 sl LOCK_DEFAULT_NAME;
ReadMemory(pvLock, &sl, sizeof(sl), NULL); dprintf("CReaderWriterLock3 (%p): State = %x, Waiters = %d, " "Thrd = %x, Cnt = %d\n", pvLock, (sl.m_lRW & CReaderWriterLock3::SL_STATE_MASK) >> CReaderWriterLock3::SL_STATE_SHIFT, (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 );
return TRUE; }
BOOL PrintLock( LOCK_LOCKTYPE lt, IN PVOID pvLock, IN INT nVerbose) { BOOL f = FALSE; switch (lt) { case LOCK_SMALLSPINLOCK: f = Print_SmallSpinLock(pvLock, nVerbose); break; #ifdef TEST_LOCKS
case LOCK_SPINLOCK1: f = Print_SpinLock1(pvLock, nVerbose); break; case LOCK_SPINLOCK2: f = Print_SpinLock2(pvLock, nVerbose); break; #endif // TEST_LOCKS
case LOCK_SPINLOCK: f = Print_SpinLock(pvLock, nVerbose); break; case LOCK_FAKELOCK: f = Print_FakeLock(pvLock, nVerbose); break; case LOCK_CRITSEC: f = Print_CritSec(pvLock, nVerbose); break; case LOCK_RTLRESOURCE: f = Print_RtlResource(pvLock, nVerbose); break; case LOCK_SHARELOCK: f = Print_ShareLock(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; default: f = FALSE; break; }
return f; }
|