windows-nt/Source/XPSP1/NT/net/irda/irutil/irtimer.c
2020-09-26 16:20:57 +08:00

134 lines
3.1 KiB
C

#include <irda.h>
#include <irioctl.h>
#include <irlap.h>
#include <irlmp.h>
VOID
IrdaTimerExpFunc(struct CTEEvent *Event, void *Arg);
void
IrdaTimerInitialize(PIRDA_TIMER pTimer,
VOID (*ExpFunc)(PVOID Context),
UINT Timeout,
PVOID Context,
PIRDA_LINK_CB pIrdaLinkCb)
{
#if DBG
DEBUGMSG(DBG_TIMER, (TEXT("%hs timer initialized, context %x\n"),
pTimer->pName, pTimer));
#endif
CTEInitTimer(&pTimer->CteTimer);
CTEInitEvent(&pTimer->CteEvent, IrdaTimerExpFunc);
pTimer->ExpFunc = ExpFunc;
pTimer->Context = Context;
pTimer->Timeout = Timeout;
pTimer->pIrdaLinkCb = pIrdaLinkCb;
}
void
TimerFuncAtDpcLevel(CTEEvent *Event, void *Arg)
{
PIRDA_TIMER pIrdaTimer = (PIRDA_TIMER) Arg;
#if DBG
DEBUGMSG(DBG_TIMER, (TEXT("%hs timer expired at DPC, context %x\n"),
pIrdaTimer->pName, pIrdaTimer));
#endif
CTEScheduleEvent(&pIrdaTimer->CteEvent, Arg);
return;
}
VOID
IrdaTimerExpFunc(struct CTEEvent *Event, void *Arg)
{
PIRDA_TIMER pIrdaTimer = (PIRDA_TIMER) Arg;
PIRDA_LINK_CB pIrdaLinkCb;
#if DBG
DEBUGMSG(DBG_TIMER, (TEXT("%hs timer expired, context %x\n"),
pIrdaTimer->pName, pIrdaTimer));
#endif
pIrdaLinkCb = pIrdaTimer->pIrdaLinkCb;
if (pIrdaLinkCb)
LOCK_LINK(pIrdaLinkCb);
if (pIrdaTimer->Late != TRUE)
pIrdaTimer->ExpFunc(pIrdaTimer->Context);
else
{
DEBUGMSG(DBG_WARN | DBG_TIMER,
(TEXT("IRDA TIMER LATE, ignoring\n")));
pIrdaTimer->Late = FALSE;
}
if (pIrdaLinkCb)
{
UNLOCK_LINK(pIrdaLinkCb);
REFDEL(&pIrdaLinkCb->RefCnt,'RMIT');
}
return;
}
VOID
IrdaTimerStart(PIRDA_TIMER pIrdaTimer)
{
if (pIrdaTimer->pIrdaLinkCb)
REFADD(&pIrdaTimer->pIrdaLinkCb->RefCnt, 'RMIT');
pIrdaTimer->Late = FALSE;
CTEStartTimer(&pIrdaTimer->CteTimer, pIrdaTimer->Timeout,
TimerFuncAtDpcLevel, (PVOID) pIrdaTimer);
#if DBG
DEBUGMSG(DBG_TIMER, (TEXT("Start timer %hs (%dms) context %x\n"),
pIrdaTimer->pName,
pIrdaTimer->Timeout,
pIrdaTimer));
#endif
return;
}
VOID
IrdaTimerStop(PIRDA_TIMER pIrdaTimer)
{
if (pIrdaTimer->pIrdaLinkCb)
LOCK_LINK(pIrdaTimer->pIrdaLinkCb);
if (CTEStopTimer(&pIrdaTimer->CteTimer) == 0)
{
pIrdaTimer->Late = TRUE;
}
else
{
if (pIrdaTimer->pIrdaLinkCb)
REFDEL(&pIrdaTimer->pIrdaLinkCb->RefCnt,'RMIT');
}
#if DBG
DEBUGMSG(DBG_TIMER, (TEXT("Timer %hs stopped, late %d\n"), pIrdaTimer->pName,
pIrdaTimer->Late));
#endif
if (pIrdaTimer->pIrdaLinkCb)
{
UNLOCK_LINK(pIrdaTimer->pIrdaLinkCb);
}
return;
}
VOID
IrdaTimerRestart(PIRDA_TIMER pIrdaTimer)
{
IrdaTimerStop(pIrdaTimer);
IrdaTimerStart(pIrdaTimer);
}