//============================================================================= // Copyright (c) 1997 Microsoft Corporation // // File Name: igmptimer.h // // Abstract: // This module contains declarations related to igmptimer. // // Author: K.S.Lokesh (lokeshs@) 11-1-97 // // Revision History: // //============================================================================= #ifndef _IGMP_TIMER_H_ #define _IGMP_TIMER_H_ VOID DebugCheckTimerContexts( ); // // set the debug timer flags, so that I can control the amount of tracing // printed out. // #if DBG #ifndef DEBUG_TIMER_LEVEL #define DEBUG_TIMER_LEVEL 0x0 #endif #else #ifdef DEBUG_TIMER_LEVEL #undef DEBUG_TIMER_LEVEL #endif #define DEBUG_TIMER_LEVEL 0x0 #endif #define DBG_Y TRUE #define DBG_N FALSE #define DEBUG_TIMER_ACTIVITY (DEBUG_TIMER_LEVEL & 0x00000001) #define DEBUG_TIMER_TIMERID (DEBUG_TIMER_LEVEL & 0x00000010) #define DEBUG_FLAGS_SIGNATURE (DEBUG_TIMER_LEVEL & 0x00000010) #define DEBUG_TIMER_PROCESSQUEUE1 (DEBUG_TIMER_LEVEL & 0x00000020) #define DEBUG_TIMER_PROCESSQUEUE2 (DEBUG_TIMER_LEVEL & 0x00000040) #define DEBUG_TIMER_RESYNCTIMER (DEBUG_TIMER_LEVEL & 0x00000080) #define DEBUG_TIMER_REMOVETIMER1 (DEBUG_TIMER_LEVEL & 0x00000100) #define DEBUG_TIMER_REMOVETIMER2 (DEBUG_TIMER_LEVEL & 0x00000200) #define DEBUG_TIMER_INSERTTIMER1 (DEBUG_TIMER_LEVEL & 0x00001000) #define DEBUG_TIMER_INSERTTIMER2 (DEBUG_TIMER_LEVEL & 0x00002000) #define DEBUG_TIMER_UPDATETIMER1 (DEBUG_TIMER_LEVEL & 0x00010000) #define DEBUG_TIMER_PACKET (DEBUG_TIMER_LEVEL & 0x00020000) //------------------------------------------------------------------------------ // GLOBAL DEFINITIONS // // number of buckets in Timer Table // 0-14,14-28,28-42,... last bucket has >63*14=882 secs (all approx) // #define NUM_TIMER_BUCKETS 64 #if DEBUG_TIMER_TIMERID extern DWORD TimerId; #endif typedef struct _IGMP_TIMER_ENTRY { LIST_ENTRY Link; LONGLONG Timeout; LPTHREAD_START_ROUTINE Function; PVOID Context; UCHAR Status; #if DEBUG_TIMER_TIMERID DWORD Id; DWORD Id2; DWORD IfIndex; DWORD Group; DWORD Source; DWORD Signature; //0xfadfad01 #endif } IGMP_TIMER_ENTRY, *PIGMP_TIMER_ENTRY; #if DEBUG_FLAGS_SIGNATURE && DEBUG_TIMER_TIMERID #define CHECK_TIMER_SIGNATURE(pte) {\ if ((pte)->Signature != 0xfadfad01)\ DbgBreakPoint();\ } #else #define CHECK_TIMER_SIGNATURE(pte) #endif typedef struct _IGMP_TIMER_GLOBAL { HANDLE WTTimer; // timer set with wait server HANDLE WTTimer1; LONGLONG WTTimeout; // timeout value set with wait server LONGLONG SyncTime; // time when time queue last reordered LARGE_INTEGER CurrentTime; DWORD NumTimers; DWORD TableLowIndex; LIST_ENTRY TimesTable[NUM_TIMER_BUCKETS]; // array of times UCHAR Status; CRITICAL_SECTION CS; BOOL CSFlag; } IGMP_TIMER_GLOBAL, *PIGMP_TIMER_GLOBAL; #define GET_IGMP_CURRENT_TIME( ) igmp.WTTimer.CurrentTime.QuadPart // TIMER_STATUS #define TIMER_STATUS_CREATED 0x01 #define TIMER_STATUS_INACTIVE 0x02 #define TIMER_STATUS_ACTIVE 0x04 #define TIMER_STATUS_FIRED 0x08 #define TIMER_STATUS_DELETED 0x80 // // MACROS // #define IS_TIMER_ACTIVE(pTimer) ((pTimer).Status & TIMER_STATUS_ACTIVE) #define SET_TIMER_INFINITE(time) \ time = 0 #define IS_TIMER_INFINITE(time) \ (time == 0) #if DEBUG_FLAGS_SIGNATURE //deldel #define ACQUIRE_TIMER_LOCK(proc) { \ ENTER_CRITICAL_SECTION(&g_TimerStruct.CS, "g_TimerStruct.CS1", proc); \ ++g_TimerStruct.CSFlag; \ } #define RELEASE_TIMER_LOCK(proc) {\ --g_TimerStruct.CSFlag; \ LEAVE_CRITICAL_SECTION(&g_TimerStruct.CS, "g_TimerStruct.CS1", proc); \ } #define CHECK_IF_ACQUIRED_TIMER_LOCK() {\ if (g_TimerStruct.CSFlag<=0) DbgBreakPoint();\ } #else #define ACQUIRE_TIMER_LOCK(proc) { \ ENTER_CRITICAL_SECTION(&g_TimerStruct.CS, "g_TimerStruct.CS1", proc); \ } #define RELEASE_TIMER_LOCK(proc) {\ LEAVE_CRITICAL_SECTION(&g_TimerStruct.CS, "g_TimerStruct.CS1", proc); \ } #define CHECK_IF_ACQUIRED_TIMER_LOCK() #endif #define SET_TIMER_ID(_pTimer, _Id1, _IfIndex, _Group, _Source) {\ (_pTimer)->Id = _Id1; \ (_pTimer)->Id2 = TimerId++;\ (_pTimer)->IfIndex = _IfIndex;\ (_pTimer)->Group = _Group; \ (_pTimer)->Source = _Source; \ (_pTimer)->Signature = 0xfadfad01; \ } // // currently all times mentioned in the config structure are in seconds // #define CONV_CONFIG_TO_INTERNAL_TIME(time) \ (time *= 1000) #define CONFIG_TO_INTERNAL_TIME(time) \ ((time) * 1000) #define CONV_INTERNAL_TO_CONFIG_TIME(time) \ (time /= 1000); #define CONFIG_TO_SYSTEM_TIME(time) \ (time) #define SYSTEM_TIME_TO_SEC(time) \ ((DWORD)((time) / (LONGLONG)1000L)) #define SYSTEM_TIME_TO_MSEC(time) \ ((DWORD)(time)) // //FUNCTION PROTOTYPES // LONGLONG GetCurrentIgmpTime( ); VOID UpdateLocalTimer ( PIGMP_TIMER_ENTRY pte, LONGLONG llNewTime, BOOL bDbgPrint ); VOID RemoveTimer ( PIGMP_TIMER_ENTRY pte, BOOL bDbg ); DWORD InsertTimer ( PIGMP_TIMER_ENTRY pte, LONGLONG llNewTime, BOOL bResync, BOOL bDbg ); ULONG QueryRemainingTime( PIGMP_TIMER_ENTRY pte, LONGLONG llCurTime ); DWORD InitializeTimerGlobal ( ); VOID DeInitializeTimerGlobal ( ); VOID DebugPrintTimerEntry ( PIGMP_TIMER_ENTRY pte, DWORD dwBucket, LONGLONG llCurTime ); VOID GetTimerDebugInfo( CHAR str1[20], CHAR str2[20], DWORD *pdwDiffTime, PIGMP_TIMER_ENTRY pte, LONGLONG llCurtime ); DWORD DebugScanTimerQueue( DWORD Id ); VOID DebugPrintTimerQueue ( ); #endif //ifndef _IGMP_TIMER_H_