#ifndef _WINSDBG_ #define _WINSDBG_ /*++ Copyright (c) 1989 Microsoft Corporation Module Name: winsdbg.h Abstract: This file contains debug related macros and functions for the WINS server Functions: Portability: This header is portable. Author: Pradeep Bahl (PradeepB) Feb-1993 Revision History: Modification Date Person Description of Modification ------------------ ------- --------------------------- --*/ /* includes */ /* defines */ #ifdef CPLUSPLUS extern "C" { #endif #if DBG #ifndef WINSDBG #define WINSDBG #endif #define DBGSVC 1 #endif #ifdef WINSDBG #define STATIC #ifdef WINS_INTERACTIVE #define PRINTF(pstr) {printf ## pstr; } #else //#define PRINTF(pstr) WINSEVT_LOG_PRINT_M(pstr) #ifdef DBGSVC //#define PRINTF(pstr) {if (pNmsDbgFile != NULL) fprintf(pNmsDbgFile, pstr);} // // files for storing debugs. // extern VOID NmsChkDbgFileSz(VOID); extern HANDLE NmsDbgFileHdl; #define PRINTF(pstr) { \ int DbgBytesWritten; \ NmsChkDbgFileSz(); \ if (NmsDbgFileHdl != INVALID_HANDLE_VALUE) WriteFile(NmsDbgFileHdl, pstr, strlen(pstr), (LPDWORD)&DbgBytesWritten, NULL);} #endif #endif #define DBGIF(flag) if(flag) // // NOTE: Use RtlQueryEnvironmental function instead of getenv in the macro // below // // FUTURES: Use GetEnvironmentVariable here to be consistent with the general // usage of WIN32 API // #define DBGINIT { \ LPBYTE _pStr; \ _pStr = getenv("DBGFLAGS"); \ WinsDbg = _pStr == NULL ? 0 : atoi(_pStr); \ } // // check if replication should be disabled // #define DBGCHK_IF_RPL_DISABLED { \ LPBYTE _pStr; \ _pStr = getenv("RPLDISABLED"); \ fWinsCnfRplEnabled = _pStr == NULL ? TRUE : FALSE;\ } // // check if scavenging should be disabled // #define DBGCHK_IF_SCV_DISABLED { \ LPBYTE _pStr; \ _pStr = getenv("SCVDISABLED"); \ fWinsCnfScvEnabled = _pStr == NULL ? TRUE : FALSE;\ } // //FUTURES -- "Make this macro independent of DBG or WINSDBG") // // check if Perforamance Monitoring should be disabled // #define DBGCHK_IF_PERFMON_ENABLED { \ LPBYTE _pStr; \ _pStr = getenv("PERFMON_ENABLED"); \ fWinsCnfPerfMonEnabled = _pStr == NULL ? FALSE : TRUE;\ } #define IF_DBG(flag) if (WinsDbg & (DBG_ ## flag)) #ifdef WINS_INTERACTIVE #define DBGPRINT0(flag, str) {IF_DBG(flag) PRINTF((str));} #define DBGPRINT1(flag,str, v1) {IF_DBG(flag) PRINTF((str,v1));} #define DBGPRINT2(flag,str, v1,v2) {IF_DBG(flag) PRINTF((str,v1,v2));} #define DBGPRINT3(flag,str, v1,v2,v3) {IF_DBG(flag) PRINTF((str,v1,v2,v3));} #define DBGPRINT4(flag,str, v1,v2,v3,v4) {IF_DBG(flag) PRINTF((str,v1,v2,v3,v4));} #define DBGPRINT5(flag,str, v1,v2,v3,v4,v5) {IF_DBG(flag) PRINTF((str,v1,v2,v3,v4,v5));} #else #ifdef DBGSVC #define DBGPRINT0(flag, str) {IF_DBG(flag) {char cstr[500]; sprintf(cstr, str);PRINTF(cstr);}} #define DBGPRINT1(flag,str, v1) {IF_DBG(flag) {char cstr[500]; sprintf(cstr,str,v1);PRINTF(cstr);}} #define DBGPRINT2(flag,str, v1,v2) {IF_DBG(flag) {char cstr[500]; sprintf(cstr,str,v1,v2);PRINTF(cstr);}} #define DBGPRINT3(flag,str, v1,v2,v3) {IF_DBG(flag) {char cstr[500]; sprintf(cstr,str,v1,v2,v3);PRINTF(cstr);}} #define DBGPRINT4(flag,str, v1,v2,v3,v4) {IF_DBG(flag) {char cstr[500]; sprintf(cstr, str,v1,v2,v3,v4);PRINTF(cstr);}} #define DBGPRINT5(flag,str, v1,v2,v3,v4,v5) {IF_DBG(flag) {char cstr[500]; sprintf(cstr, str,v1,v2,v3,v4,v5);PRINTF(cstr);}} #endif #endif #define DBGMYNAME(x) { \ PWINSTHD_TLS_T _pTls; \ _pTls = TlsGetValue(WinsTlsIndex); \ if (_pTls == NULL) \ { \ printf("Couldn't get ptr to TLS storage for storing thd name. Error is (%d)\n", GetLastError());\ } \ else \ { \ RtlCopyMemory(_pTls->ThdName, x, strlen(x)); \ _pTls->ThdName[strlen(x)] = EOS; \ } \ } #define DBGPRINTNAME { \ PWINSTHD_TLS_T _pTls; \ _pTls = TlsGetValue(WinsTlsIndex); \ if (_pTls == NULL) \ { \ DBGPRINT1(ERR, \ "Couldn't get ptr to TLS storage for reading thd name. Error = (%X)\n", GetLastError()); \ } \ else \ { \ DBGPRINT1(FLOW, "%s\n",_pTls->ThdName); \ } \ } #define DBGPRINTEXC(str) { \ DBGPRINT0(EXC, str); \ DBGPRINT1(EXC, ": Got Exception (%x)\n",\ (DWORD)GetExceptionCode() ); \ } #define DBGENTER(str) { \ DBGPRINT0(FLOW, "ENTER:") \ DBGPRINT0(FLOW, str); \ } #define DBGLEAVE(str) { \ DBGPRINT0(FLOW, "LEAVE:") \ DBGPRINT0(FLOW, str); \ } #define DBGSTART_PERFMON if(fWinsCnfPerfMonEnabled) { #define DBGEND_PERFMON } // // Use this macro in the var. declaration section of the function in which // performance monitoring needs to be done // // #define DBG_PERFMON_VAR \ LARGE_INTEGER LiStartCnt, LiEndCnt; \ // // Use this macro at the point from where you wish to start doing performance // monitoring. Make sure that the macro DBG_PERFMON_VAR is used in the // variable declaration section of the function // #define DBG_START_PERF_MONITORING \ DBGSTART_PERFMON \ if (fWinsCnfHighResPerfCntr) \ { \ printf("MONITOR START\n"); \ QueryPerformanceCounter(&LiStartCnt); \ printf("Current Count = (%x %x)\n", \ LiStartCnt.HighPart, \ LiStartCnt.LowPart \ ); \ } \ DBGEND_PERFMON // // Use this macro at the point at which you wich to stop doing the monitoring // The macro prints out the time spent in the section delimited by // DBG_START_PERF_MONITORING and this macro // // #define DBG_PRINT_PERF_DATA \ DBGSTART_PERFMON \ LARGE_INTEGER TimeElapsed; \ if (fWinsCnfHighResPerfCntr) \ { \ QueryPerformanceCounter(&LiEndCnt); \ TimeElapsed = LiDiv( \ LiSub(LiEndCnt, LiStartCnt), LiWinsCnfPerfCntrFreq \ ); \ printf("MONITOR END.\nEnd Count = (%x %x)\n", \ LiEndCnt.HighPart, \ LiEndCnt.LowPart \ ); \ printf("Time Elapsed (%d %d)\n", TimeElapsed.HighPart, TimeElapsed.LowPart); \ } \ DBGEND_PERFMON #define DBGPRINTTIME(Type,Str, Time) \ { \ TIME_ZONE_INFORMATION tzInfo; \ SYSTEMTIME LocalTime; \ GetTimeZoneInformation(&tzInfo); \ SystemTimeToTzSpecificLocalTime(&tzInfo, &(WinsIntfStat.TimeStamps.Time), &LocalTime); \ DBGPRINT5(Type, Str ## "on %d/%d at %d.%d.%d\n", \ LocalTime.wMonth, \ LocalTime.wDay, \ LocalTime.wHour, \ LocalTime.wMinute, \ LocalTime.wSecond \ ); \ } #define WINSDBG_INC_SEC_COUNT_M(SecCount) (SecCount)++ #else #define STATIC //#define STATIC static #define PRINTF(str) #define DBGIF(flag) #define IF_DBG(flag) #define DBGINIT #define DBGCHK_IF_RPL_DISABLED #define DBGCHK_IF_SCV_DISABLED #define DBGCHK_IF_SCV_ENABLED #define DBGCHK_IF_PERFMON_ENABLED #define DBGPRINT0(flag,str) #define DBGPRINT1(flag,str, v1) #define DBGPRINT2(flag,str, v1,v2) #define DBGPRINT3(flag,str, v1,v2,v3) #define DBGPRINT4(flag,str, v1,v2,v3,v4) #define DBGPRINT5(flag,str, v1,v2,v3,v4,v5) #define DBGMYNAME(x) #define DBGPRINTEXC(x) #define DBGENTER(x) #define DBGLEAVE(x) #define DBGSTART_PERFMON #define DBGEND_PERFMON #define DBG_PERFMON_VAR #define DBG_START_PERF_MONITORING #define DBG_PRINT_PERF_DATA #define DBGPRINTTIME(Type, Str, Time) #define DBGPRINTNAME #define WINSDBG_INC_SEC_COUNT_M(SecCount) #endif #define WINSDBG_FILE TEXT("wins.dbg") #define WINSDBG_FILE_BK TEXT("wins.bak") #define DBG_EXC 0x00000001 //exceptions #define DBG_ERR 0x00000002 //errors that do not result in //exceptions #define DBG_FLOW 0x00000004 //Control flow #define DBG_HEAP 0x00000008 //heap related debugs #define DBG_SPEC 0x00000010 //for special debugs #define DBG_DS 0x00000020 //Data structures #define DBG_DET 0x00000040 //detailed stuff #define DBG_INIT 0x00000080 //Initialization stuff #define DBG_REPL 0x00000100 //replication debugs #define DBG_SCV 0x00000200 //scavenging debugs #define DBG_HEAP_CRDL 0x00000400 //heap creation/deletion #define DBG_HEAP_CNTRS 0x00000800 //heap creation/deletion #define DBG_TM 0x00001000 //time related debugs #define DBG_CHL 0x00002000 //challenge mgr. related debugs #define DBG_RPL 0x00004000 //challenge mgr. related debugs #define DBG_RPLPULL 0x00008000 //challenge mgr. related debugs #define DBG_RPLPUSH 0x00010000 //challenge mgr. related debugs #define DBG_UPD_CNTRS 0x01000000 //update counters #define DBG_TMP 0x02000000 //for temporary debugs #define DBG_INIT_BRKPNT 0x10000000 //breakpoint at the begining #define DBG_MTCAST 0x20000000 //mcast debugs /* macros */ /* externs */ extern ULONG WinsDbg; /* typedef definitions */ /* function declarations */ #ifdef CPLUSPLUS } #endif #endif