windows-nt/Source/XPSP1/NT/net/rras/ndis/rasl2tp/timer.h
2020-09-26 16:20:57 +08:00

203 lines
5 KiB
C

// Copyright (c) 1997, Microsoft Corporation, all rights reserved
//
// timer.h
// RAS L2TP WAN mini-port/call-manager driver
// Timer management header
//
// 01/07/97 Steve Cobb
//
// This interface encapsulates the queuing of multiple timer events onto a
// single NDIS timer.
#ifndef _TIMER_H_
#define _TIMER_H_
//-----------------------------------------------------------------------------
// Data structures
//-----------------------------------------------------------------------------
// Forward declarations.
//
typedef struct _TIMERQ TIMERQ;
typedef struct _TIMERQITEM TIMERQITEM;
typedef enum _TIMERQEVENT TIMERQEVENT;
// Timer queue event handler. 'PTqi' and 'pContext' are the timer event
// descriptor and user context passed to TimerQScheduleItem. 'Event' is the
// timer event code indicating whether the timer expired, was cancelled, or
// the queue was terminated.
//
// The "cancel" event is never generated internally, but only by a user call
// to TimerQCancelItem, thus user may require specific locks be held for
// "cancel" events. User cannot require than specific locks be held for
// "expire" or "terminate" events as these may be generated internally. User
// should pay attention to the return codes of TimerQCancelItem and
// TimerQTerminateItem calls, as it will occassionally be impossible to stop
// an "expire" event that has not yet been processed from occurring.
//
typedef
VOID
(*PTIMERQEVENT)(
IN TIMERQITEM* pTqi,
IN VOID* pContext,
IN TIMERQEVENT event );
// Timer queue termination completion handler. 'PTimerQ' is the timer queue
// descriptor. 'PContext' is user's context as passed to TimerQTerminate.
// Caller must not free or reuse the TIMERQ before this routine is called.
//
typedef
VOID
(*PTIMERQTERMINATECOMPLETE)(
IN TIMERQ* pTimerQ,
IN VOID* pContext );
// Timer queue descriptor. All access should be via the TimerQ* interface.
// There is no reason user should look inside. All necessary locking is
// handled internally.
//
typedef struct
_TIMERQ
{
// Set to MTAG_TIMERQ when the block is valid and to MTAG_FREED when no
// longer valid.
//
LONG ulTag;
// Head of a double-linked list of "ticking" TIMERQITEMs. The list is
// sorted by time to expiration with the earliest expiration at the head
// of the list. The list is protected by 'lock'.
//
LIST_ENTRY listItems;
// Caller's terminate complete handler as passed to TimerQTerminate. This
// is non-NULL only when our internal timer event handler must call it.
//
PTIMERQTERMINATECOMPLETE pHandler;
// User's PTIMERQTERMINATECOMPLETE context passed back to 'pHandler'.
//
VOID* pContext;
// Set when the timer queue is terminating. No other requests are
// accepted when this is the case.
//
BOOLEAN fTerminating;
// Spin lock protecting the 'listItems' list.
//
NDIS_SPIN_LOCK lock;
// NDIS timer object.
//
NDIS_TIMER timer;
}
TIMERQ;
// Timer queue event descriptor. All access should be via the TimerQ*
// interface. There is no reason user should look inside. This is exposed to
// allow user to efficiently manage allocation of TIMERQITEMS for several
// timers from a large pool.
//
typedef struct
_TIMERQITEM
{
// Links to the prev/next TIMERQITEM in the owning TIMERQ's chain of
// pending timer events. Access is protected by 'lock' in the TIMERQ
// structure.
//
LIST_ENTRY linkItems;
// System time at which this event should occur.
//
LONGLONG llExpireTime;
// User's routine to handle the timeout event when it occurs.
//
PTIMERQEVENT pHandler;
// User's PTIMERQEVENT context passed back to 'pHandler'.
//
VOID* pContext;
}
TIMERQITEM;
// Indicates the event which triggered user's callback to be called.
//
typedef enum
_TIMERQEVENT
{
// The timeout interval has elapsed or user called TimerQExpireItem.
//
TE_Expire,
// User called TimerQCancelItem.
//
TE_Cancel,
// User called TimerQTerminateItem or called TimerQTerminate while the
// item was queued.
//
TE_Terminate
}
TIMERQEVENT;
//-----------------------------------------------------------------------------
// Interface prototypes
//-----------------------------------------------------------------------------
BOOLEAN
IsTimerQItemScheduled(
IN TIMERQITEM* pItem );
VOID
TimerQInitialize(
IN TIMERQ* pTimerQ );
VOID
TimerQInitializeItem(
IN TIMERQITEM* pItem );
VOID
TimerQTerminate(
IN TIMERQ* pTimerQ,
IN PTIMERQTERMINATECOMPLETE pHandler,
IN VOID* pContext );
VOID
TimerQScheduleItem(
IN TIMERQ* pTimerQ,
IN OUT TIMERQITEM* pNewItem,
IN ULONG ulTimeoutMs,
IN PTIMERQEVENT pHandler,
IN VOID* pContext );
BOOLEAN
TimerQCancelItem(
IN TIMERQ* pTimerQ,
IN TIMERQITEM* pItem );
BOOLEAN
TimerQExpireItem(
IN TIMERQ* pTimerQ,
IN TIMERQITEM* pItem );
CHAR*
TimerQPszFromEvent(
IN TIMERQEVENT event );
BOOLEAN
TimerQTerminateItem(
IN TIMERQ* pTimerQ,
IN TIMERQITEM* pItem );
#endif // TIMER_H_