Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

267 lines
6.3 KiB

//=============================================================================
// 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_