windows-nt/Source/XPSP1/NT/sdktools/debuggers/windbg/miscdbg.cpp
2020-09-26 16:20:57 +08:00

207 lines
4.6 KiB
C++

/*++
Copyright (c) 1992-1999 Microsoft Corporation
Module Name:
miscdbg.cpp
Abstract:
Contains code to aid in internal debugging.
--*/
#include "precomp.hxx"
#pragma hdrstop
#ifdef DBG
VOID
Dbg_Windbg_InitializeCriticalSection(
PDBG_WINDBG_CRITICAL_SECTION pDbgCritSec,
PTSTR pszName,
PTSTR pszFile,
int nLine
)
{
InitializeCriticalSection( &pDbgCritSec->cs );
pDbgCritSec->Initialize(pszName);
}
BOOL
Dbg_Windbg_TryEnterCriticalSection(
PDBG_WINDBG_CRITICAL_SECTION pDbgCritSec,
PTSTR pszFile,
int nLine
)
{
BOOL b = TryEnterCriticalSection( &pDbgCritSec->cs );
if (b) {
++pDbgCritSec->nLockCount;
pDbgCritSec->OwnerId = GetCurrentThreadId();
DPRINT(DP_CRITSEC_VERBOSE,
( _T(" *** TryEnterCriticalSection \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
pDbgCritSec->pszLock_LastFile = pszFile;
pDbgCritSec->nLock_LastFile = nLine;
}
if (pDbgCritSec->nLockCount++ > 1) {
DPRINT(DP_CRITSEC_INFO,
( _T(" *** INFO: Locked twice. \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
}
return b;
}
VOID
Dbg_Windbg_EnterCriticalSection(
PDBG_WINDBG_CRITICAL_SECTION pDbgCritSec,
PTSTR pszFile,
int nLine
)
{
if (pDbgCritSec->nLockCount
&& GetCurrentThreadId() != pDbgCritSec->OwnerId ) {
DPRINT(DP_CRITSEC_INFO,
( _T(" *** INFO: Waiting on another thread. \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
}
EnterCriticalSection( &pDbgCritSec->cs );
pDbgCritSec->OwnerId = GetCurrentThreadId();
pDbgCritSec->pszLock_LastFile = pszFile;
pDbgCritSec->nLock_LastFile = nLine;
if (pDbgCritSec->nLockCount++ > 1) {
DPRINT(DP_CRITSEC_INFO,
( _T(" *** INFO: Locked twice. \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
}
DPRINT(DP_CRITSEC_VERBOSE,
( _T(" *** Dbg_EnterCriticalSection \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
}
VOID
Dbg_Windbg_LeaveCriticalSection(
PDBG_WINDBG_CRITICAL_SECTION pDbgCritSec,
PTSTR pszFile,
int nLine
)
{
DPRINT(DP_CRITSEC_VERBOSE,
( _T(" *** Dbg_LeaveCriticalSection \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
if (GetCurrentThreadId() != pDbgCritSec->OwnerId ) {
DPRINT(DP_CRITSEC_ERROR,
( _T(" *** ERROR: Not owner. Dbg_LeaveCriticalSection \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
Assert(!"API lock released when not owned");
}
if (pDbgCritSec->nLockCount < 1) {
DPRINT(DP_CRITSEC_ERROR,
( _T(" *** ERROR: Count is 0. Dbg_LeaveCriticalSection \'%s\' %s %d\n"),
pDbgCritSec->pszName,
pszFile,
nLine
) );
Assert(!"API Lock released when count is 0");
} else {
if (--pDbgCritSec->nLockCount == 0) {
pDbgCritSec->OwnerId = 0;
}
LeaveCriticalSection(&pDbgCritSec->cs);
}
pDbgCritSec->pszUnlock_LastFile = pszFile;
pDbgCritSec->nUnlock_LastFile = nLine;
}
VOID
Dbg_Windbg_DeleteCriticalSection(
PDBG_WINDBG_CRITICAL_SECTION pDbgCritSec,
PTSTR pszFile,
int nLine
)
{
DeleteCriticalSection( &pDbgCritSec->cs );
pDbgCritSec->Delete();
}
#endif // DBG
VOID
DebugPrint(
PTSTR szFormat,
...
)
{
__declspec( thread ) static TCHAR rgchDebug[1024 * 4];
__declspec( thread ) static va_list marker;
va_start( marker, szFormat );
if (-1 == _vsntprintf(rgchDebug, _tsizeof(rgchDebug), szFormat, marker ) ) {
rgchDebug[_tsizeof(rgchDebug)-1] = 0;
}
va_end( marker);
OutputDebugString( rgchDebug );
} /* DebugPrint() */
#ifdef _CPPRTTI
BOOL
RttiTypesEqual(
const type_info & t1,
const type_info & t2
)
{
return t1 == t2;
}
#endif