161 lines
3.6 KiB
C
161 lines
3.6 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
atktimer.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
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _ATKTIMER_
|
|||
|
#define _ATKTIMER_
|
|||
|
|
|||
|
struct _TimerList;
|
|||
|
|
|||
|
typedef LONG (FASTCALL * TIMER_ROUTINE)(IN struct _TimerList *pTimer, IN BOOLEAN TimerShuttingDown);
|
|||
|
|
|||
|
#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
|
|||
|
TIMER_ROUTINE tmr_Routine; // Timer routine
|
|||
|
SHORT tmr_AbsTime; // Absolute time, for re-enqueue
|
|||
|
SHORT tmr_RelDelta; // Relative to the previous entry
|
|||
|
union
|
|||
|
{
|
|||
|
struct
|
|||
|
{
|
|||
|
BOOLEAN tmr_Queued; // TRUE, if currently queued
|
|||
|
BOOLEAN tmr_Cancelled; // TRUE, if cancelled
|
|||
|
BOOLEAN tmr_Running; // TRUE, if currently running
|
|||
|
BOOLEAN tmr_CancelIt; // TRUE, if cancel called while active
|
|||
|
};
|
|||
|
DWORD tmr_Bools; // For clearing all
|
|||
|
};
|
|||
|
} TIMERLIST, *PTIMERLIST;
|
|||
|
|
|||
|
extern
|
|||
|
NTSTATUS
|
|||
|
AtalkTimerInit(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
/*** AtalkTimerInitialize
|
|||
|
*
|
|||
|
* Initialize the timer list structure.
|
|||
|
extern
|
|||
|
VOID
|
|||
|
AtalkTimerInitialize(
|
|||
|
IN PTIMERLIST pList, // TimerList to use for queuing
|
|||
|
IN TIMER_ROUTINE TimerRoutine, // TimerRoutine
|
|||
|
IN SHORT DeltaTime // Schedule after this much time
|
|||
|
);
|
|||
|
*/
|
|||
|
|
|||
|
#if DBG
|
|||
|
#define AtalkTimerInitialize(pList, TimerRoutine, DeltaTime) \
|
|||
|
{ \
|
|||
|
(pList)->tmr_Signature = TMR_SIGNATURE; \
|
|||
|
(pList)->tmr_Routine = TimerRoutine; \
|
|||
|
(pList)->tmr_AbsTime = DeltaTime; \
|
|||
|
(pList)->tmr_Bools = 0; \
|
|||
|
}
|
|||
|
#else
|
|||
|
#define AtalkTimerInitialize(pList, TimerRoutine, DeltaTime) \
|
|||
|
{ \
|
|||
|
(pList)->tmr_Routine = TimerRoutine; \
|
|||
|
(pList)->tmr_AbsTime = DeltaTime; \
|
|||
|
(pList)->tmr_Bools = 0; \
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
extern
|
|||
|
VOID FASTCALL
|
|||
|
AtalkTimerScheduleEvent(
|
|||
|
IN PTIMERLIST pTimerList // TimerList to use for queuing
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
VOID
|
|||
|
AtalkTimerFlushAndStop(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
BOOLEAN FASTCALL
|
|||
|
AtalkTimerCancelEvent(
|
|||
|
IN PTIMERLIST pTimerList, // TimerList used for queuing
|
|||
|
IN PDWORD pdwOldState // return old state
|
|||
|
);
|
|||
|
|
|||
|
#define AtalkTimerSetAbsTime(pTimerList, AbsTime) \
|
|||
|
{ \
|
|||
|
ASSERT(!(pTimerList)->tmr_Queued); \
|
|||
|
(pTimerList)->tmr_AbsTime = AbsTime; \
|
|||
|
}
|
|||
|
|
|||
|
extern LONG AtalkTimerCurrentTick;
|
|||
|
|
|||
|
#define AtalkGetCurrentTick() AtalkTimerCurrentTick
|
|||
|
|
|||
|
// Keep this at 100ms unit
|
|||
|
#define ATALK_TIMER_FACTOR 10 // i.e. 10 ticks per second
|
|||
|
#define ATALK_TIMER_TICK -1000000L // 100ms in 100ns units
|
|||
|
#define ATALK_TIMER_NO_REQUEUE 0 // Do not re-enqueue
|
|||
|
#define ATALK_TIMER_REQUEUE -1 // Re-enqueue at current count
|
|||
|
|
|||
|
#define ATALK_TIMER_QUEUED 1
|
|||
|
#define ATALK_TIMER_RUNNING 2
|
|||
|
#define ATALK_TIMER_CANCELLED 3
|
|||
|
|
|||
|
|
|||
|
extern PTIMERLIST atalkTimerList;
|
|||
|
extern ATALK_SPIN_LOCK atalkTimerLock;
|
|||
|
extern LARGE_INTEGER atalkTimerTick;
|
|||
|
extern KTIMER atalkTimer;
|
|||
|
extern KDPC atalkTimerDpc;
|
|||
|
extern KEVENT atalkTimerStopEvent;
|
|||
|
extern BOOLEAN atalkTimerStopped; // Set to TRUE if timer system stopped
|
|||
|
extern BOOLEAN atalkTimerRunning; // Set to TRUE when timer Dpc is running
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkTimerDpcRoutine(
|
|||
|
IN PKDPC pKDpc,
|
|||
|
IN PVOID pContext,
|
|||
|
IN PVOID SystemArgument1,
|
|||
|
IN PVOID SystemArgument2
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID FASTCALL
|
|||
|
atalkTimerEnqueue(
|
|||
|
IN PTIMERLIST pList
|
|||
|
);
|
|||
|
|
|||
|
#endif // _ATKTIMER_
|
|||
|
|
|||
|
|
|||
|
|