176 lines
6.9 KiB
C
176 lines
6.9 KiB
C
|
//---------------------------------------------------------------------------
|
||
|
// log.h - theme logging routines
|
||
|
//---------------------------------------------------------------------------
|
||
|
#pragma once
|
||
|
//---------------------------------------------------------------------------
|
||
|
#ifndef LOG_H
|
||
|
#define LOG_H
|
||
|
//---------------------------------------------------------------------------
|
||
|
#include "logopts.h" // log options as enums
|
||
|
//---------------------------------------------------------------------------
|
||
|
#ifdef DEBUG
|
||
|
#define LOGGING 1
|
||
|
#endif
|
||
|
//-----------------------------------------------------------------
|
||
|
//---- set this to "GetMemUsage", "GetUserCount", or "GetGdiCount" ----
|
||
|
//---- it controls which resource is tracked across entry/exit calls ----
|
||
|
#define ENTRY_EXIT_FUNC GetGdiCount()
|
||
|
#define ENTRY_EXIT_NAME L"GdiCount()"
|
||
|
//-----------------------------------------------------------------
|
||
|
// Note:
|
||
|
// For builds without DEBUG defined (FRE builds), calling
|
||
|
// code will reference an underscore version of all public
|
||
|
// logging routines (_xxx()). These functions are defined
|
||
|
// as inline with little or no code (no code means no caller
|
||
|
// code is generated).
|
||
|
//
|
||
|
// For DEBUG defined (CHK) builds, the calling code connects
|
||
|
// with the normally named logging routines.
|
||
|
//
|
||
|
// This is done to keep calling code to a minimum for FRE
|
||
|
// builds, to avoid LOG2(), LOG3() type defines that vary
|
||
|
// with param count, and to keep build system happy when
|
||
|
// mixing FRE and CHK callers and libraries.
|
||
|
//-----------------------------------------------------------------
|
||
|
//---- these are used for CHK builds only but must be defined for both ----
|
||
|
void Log(UCHAR uLogOption, LPCSTR pszSrcFile, int iLineNum, int iEntryCode, LPCWSTR pszFormat, ...);
|
||
|
BOOL LogStartUp();
|
||
|
BOOL LogShutDown();
|
||
|
void LogControl(LPCSTR pszOptions, BOOL fEcho);
|
||
|
void TimeToStr(UINT uRaw, WCHAR *pszBuff);
|
||
|
DWORD StartTimer();
|
||
|
DWORD StopTimer(DWORD dwStartTime);
|
||
|
HRESULT OpenLogFile(LPCWSTR pszLogFileName);
|
||
|
void CloseLogFile();
|
||
|
int GetMemUsage();
|
||
|
int GetUserCount();
|
||
|
int GetGdiCount();
|
||
|
BOOL LogOptionOn(int iLogOption);
|
||
|
//-----------------------------------------------------------------
|
||
|
#ifdef LOGGING
|
||
|
|
||
|
#define LogEntry(pszFunc) \
|
||
|
LOGENTRYCODE; Log(LO_TMAPI, LOGPARAMS, 1, L"%s ENTRY (%s=%d)", pszFunc, \
|
||
|
ENTRY_EXIT_NAME, _iEntryValue);
|
||
|
|
||
|
#define LogEntryC(pszFunc, pszClass) \
|
||
|
LOGENTRYCODE; Log(LO_TMAPI, LOGPARAMS, 1, L"%s ENTRY, class=%s (%s=%d)", \
|
||
|
pszFunc, pszClass, ENTRY_EXIT_NAME, _iEntryValue);
|
||
|
|
||
|
#define LogEntryW(pszFunc) \
|
||
|
LOGENTRYCODEW; Log(LO_TMAPI, LOGPARAMS, 1, L"%s ENTRY (%s=%d)", pszFunc, \
|
||
|
ENTRY_EXIT_NAME, _iEntryValue);
|
||
|
|
||
|
#define LogEntryCW(pszFunc, pszClass) \
|
||
|
LOGENTRYCODEW; Log(LO_TMAPI, LOGPARAMS, 1, L"%s ENTRY, class=%s (%s=%d)", \
|
||
|
pszFunc, pszClass, ENTRY_EXIT_NAME, _iEntryValue);
|
||
|
|
||
|
#define LogEntryNC(pszFunc) \
|
||
|
LOGENTRYCODE; Log(LO_NCTRACE, LOGPARAMS, 1, L"%s ENTRY (%s=%d)", \
|
||
|
pszFunc, ENTRY_EXIT_NAME, _iEntryValue);
|
||
|
|
||
|
#define LogEntryMsg(pszFunc, hwnd, umsg) \
|
||
|
LOGENTRYCODE; Log(LO_NCMSGS, LOGPARAMS, 1, L"%s ENTRY (hwnd=0x%x, umsg=0x%x, %s=%d)", \
|
||
|
pszFunc, hwnd, umsg, ENTRY_EXIT_NAME, _iEntryValue);
|
||
|
|
||
|
#define LogExit(pszFunc) LOGEXIT(pszFunc, LO_TMAPI)
|
||
|
#define LogExitC(pszFunc, cls) LOGEXITCLS(pszFunc, LO_TMAPI, cls)
|
||
|
#define LogExitNC(pszFunc) LOGEXIT(pszFunc, LO_NCTRACE)
|
||
|
#define LogExitMsg(pszFunc) LOGEXIT(pszFunc, LO_NCMSGS)
|
||
|
|
||
|
#define LOGEXIT(pszFunc, filter) \
|
||
|
{ \
|
||
|
LOGEXITCODE; \
|
||
|
if (_iEntryValue != _ExitValue) \
|
||
|
Log(filter, LOGPARAMS, -1, L"%s EXIT [%s delta: %d]", pszFunc, ENTRY_EXIT_NAME, _ExitValue-_iEntryValue); \
|
||
|
else \
|
||
|
Log(filter, LOGPARAMS, -1, L"%s EXIT", pszFunc); \
|
||
|
}
|
||
|
|
||
|
#define LOGEXITCLS(pszFunc, filter, cls) \
|
||
|
{ \
|
||
|
LOGEXITCODE; \
|
||
|
if (_iEntryValue != _ExitValue) \
|
||
|
Log(filter, LOGPARAMS, -1, L"%s EXIT, class=%s [%s delta: %d]", pszFunc, cls, ENTRY_EXIT_NAME, _ExitValue-_iEntryValue); \
|
||
|
else \
|
||
|
Log(filter, LOGPARAMS, -1, L"%s EXIT, class=%s", pszFunc, cls); \
|
||
|
}
|
||
|
|
||
|
#ifndef _X86_
|
||
|
#define DEBUG_BREAK if (LogOptionOn(LO_BREAK)) DebugBreak(); else
|
||
|
#else
|
||
|
#define DEBUG_BREAK if (LogOptionOn(LO_BREAK)) __asm {int 3} else
|
||
|
#endif
|
||
|
|
||
|
//---- change this when you want to track something different for entry/exit ----
|
||
|
#define LOGENTRYCODE int _iEntryValue = ENTRY_EXIT_FUNC
|
||
|
#define LOGENTRYCODEW _iEntryValue = ENTRY_EXIT_FUNC
|
||
|
#define LOGEXITCODE int _ExitValue = ENTRY_EXIT_FUNC
|
||
|
|
||
|
#else
|
||
|
|
||
|
//---- for FRE builds, connect to the inline routines ----
|
||
|
#define Log _Log
|
||
|
#define LogStartUp _LogStartUp
|
||
|
#define LogShutDown _LogShutDown
|
||
|
#define LogControl _LogControl
|
||
|
#define TimeToStr _TimeToStr
|
||
|
#define StartTimer _StartTimer
|
||
|
#define StopTimer _StopTimer
|
||
|
#define OpenLogFile _OpenLogFile
|
||
|
#define CloseLogFile _CloseLogFile
|
||
|
#define LogOptionOn _LogOptionOn
|
||
|
#define GetMemUsage _GetMemUsage
|
||
|
#define GetUserCount _GetUserCount
|
||
|
#define GetGdiCount _GetGdiCount
|
||
|
|
||
|
#define LogEntry(pszFunc)
|
||
|
#define LogEntryC(pszFunc, pszClass)
|
||
|
#define LogEntryW(pszFunc)
|
||
|
#define LogEntryCW(pszFunc, pszClass)
|
||
|
#define LogExit(pszFunc)
|
||
|
#define LogExitC(pszFunc, pszClass)
|
||
|
#define LogExitW(pszFunc, pszClass)
|
||
|
#define LogEntryNC(pszFunc)
|
||
|
#define LogExitNC(pszFunc)
|
||
|
#define LogEntryMsg(pszFunc, hwnd, umsg)
|
||
|
#define LogExitMsg(x)
|
||
|
|
||
|
#define DEBUG_BREAK (0)
|
||
|
|
||
|
//---- for FRE builds, make these guys gen no or minimum code ----
|
||
|
inline void _Log(UCHAR uLogOption, LPCSTR pszSrcFile, int iLineNum, int iEntryExitCode, LPCWSTR pszFormat, ...) {}
|
||
|
inline BOOL _LogStartUp() {return TRUE;}
|
||
|
inline BOOL _LogShutDown() {return TRUE;}
|
||
|
inline void _LogControl(LPCSTR pszOptions, BOOL fEcho) {}
|
||
|
inline void _TimeToStr(UINT uRaw, WCHAR *pszBuff) {}
|
||
|
inline DWORD _StartTimer() {return 0;}
|
||
|
inline DWORD _StopTimer(DWORD dwStartTime) {return 0;}
|
||
|
inline HRESULT _OpenLogFile(LPCWSTR pszLogFileName) {return E_NOTIMPL;}
|
||
|
inline void _CloseLogFile() {}
|
||
|
inline BOOL _LogOptionOn(int iIndex) {return FALSE;}
|
||
|
inline BOOL _pszClassName(int iIndex) {return FALSE;}
|
||
|
inline int GetMemUsage() {return 0;}
|
||
|
inline int GetUserCount() {return 0;}
|
||
|
inline int GetGdiCount() {return 0;}
|
||
|
|
||
|
#endif
|
||
|
//---------------------------------------------------------------------------
|
||
|
#undef ASSERT
|
||
|
#define ATLASSERT(exp) _ASSERTE(exp)
|
||
|
#define ASSERT(exp) _ASSERTE(exp)
|
||
|
#define _ATL_NO_DEBUG_CRT
|
||
|
//---------------------------------------------------------------------------
|
||
|
#ifdef LOGGING
|
||
|
|
||
|
#define _ASSERTE(exp) if (! (exp)) { Log(LOG_ASSERT, L#exp); DEBUG_BREAK; } else
|
||
|
#define CLASSPTR(x) ((x) ? ((CRenderObj *)x)->_pszClassName : L"")
|
||
|
#define SHARECLASS(x) (LPCWSTR)x->_pszClassName
|
||
|
#else
|
||
|
#define _ASSERTE(exp) (0)
|
||
|
#define CLASSPTR(x) NULL
|
||
|
#define SHARECLASS(x) NULL
|
||
|
#endif
|
||
|
//---------------------------------------------------------------------------
|
||
|
#endif
|