268 lines
6.3 KiB
C
268 lines
6.3 KiB
C
|
//=============================================================================
|
||
|
// 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_
|