207 lines
4.6 KiB
C++
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
|