windows-nt/Source/XPSP1/NT/net/nwlink/spx/spxtimer.h
2020-09-26 16:20:57 +08:00

102 lines
2.2 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
spxtimer.h
Abstract:
This module contains routines to schedule timer events.
Author:
Jameel Hyder (jameelh@microsoft.com)
Nikhil Kamkolkar (nikhilk@microsoft.com)
Revision History:
19 Jun 1992 Initial Version
Notes: Tab stop: 4
--*/
#define TIMER_DONT_REQUEUE 0
#define TIMER_REQUEUE_CUR_VALUE 1
typedef ULONG (*TIMER_ROUTINE)(IN PVOID Context, IN BOOLEAN TimerShuttingDown);
extern
NTSTATUS
SpxTimerInit(
VOID);
extern
ULONG
SpxTimerScheduleEvent(
IN TIMER_ROUTINE Worker, // Routine to invoke when time expires
IN ULONG DeltaTime, // Schedule after this much time
IN PVOID pContext); // Context to pass to the routine
extern
VOID
SpxTimerFlushAndStop(
VOID);
extern
BOOLEAN
SpxTimerCancelEvent(
IN ULONG TimerId,
IN BOOLEAN ReEnqueue);
#define TMR_SIGNATURE *(PULONG)"ATMR"
#if DBG
#define VALID_TMR(pTmr) (((pTmr) != NULL) && \
((pTmr)->tmr_Signature == TMR_SIGNATURE))
#else
#define VALID_TMR(pTmr) ((pTmr) != NULL)
#endif
typedef struct _TimerList
{
#if DBG
ULONG tmr_Signature;
#endif
struct _TimerList * tmr_Next; // Link to next
struct _TimerList ** tmr_Prev; // Link to prev
struct _TimerList * tmr_Overflow; // Link to overflow entry in hash table
ULONG tmr_AbsTime; // Absolute time, for re-enqueue
ULONG tmr_RelDelta; // Relative to the previous entry
ULONG tmr_Id; // Unique Id for this event
BOOLEAN tmr_Cancelled; // Was the timer cancelled?
TIMER_ROUTINE tmr_Worker; // Real Worker
PVOID tmr_Context; // Real context
} TIMERLIST, *PTIMERLIST;
#define SpxGetCurrentTime() (SpxTimerCurrentTime/SPX_TIMER_FACTOR)
#define SpxGetCurrentTick() SpxTimerCurrentTime
// Keep this at a ONE second level.
#define SPX_TIMER_FACTOR 10 // i.e. 10 ticks per second
#define SPX_MS_TO_TICKS 100 // Divide ms by this to get ticks
#define SPX_TIMER_TICK -1000000L // 100ms in 100ns units
#define SPX_TIMER_WAIT 50 // Time to wait in FlushAndStop in ms
#define TIMER_HASH_TABLE 32
VOID
spxTimerDpcRoutine(
IN PKDPC pKDpc,
IN PVOID pContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2);
VOID
spxTimerWorker(
IN PTIMERLIST pList);
VOID
spxTimerEnqueue(
PTIMERLIST pListNew);