//--------------------------------------------------------------------------- // 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, ULONG cchBuff); 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, ULONG cchBuf) {} 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 # ifndef _ASSERTE # define _ASSERTE(exp) if (! (exp)) { Log(LOG_ASSERT, L#exp); DEBUG_BREAK; } else # endif _ASSERTE # define CLASSPTR(x) ((x) ? ((CRenderObj *)x)->_pszClassName : L"") # define SHARECLASS(x) (LPCWSTR)x->_pszClassName #else # ifndef _ASSERTE # define _ASSERTE(exp) (0) # endif _ASSERTE # define CLASSPTR(x) NULL # define SHARECLASS(x) NULL #endif //--------------------------------------------------------------------------- #endif