<<>> <> <> <> <> <<>> <> <> <<>> <> <<>> DIRECTORY Xl USING [currentTime, EventProcType, TimeStamp, TQ]; XlTimeEvents: CEDAR DEFINITIONS ~ BEGIN <> TEHandle: TYPE = REF TEHandleRec; <> Create: PROC [reportTQ: Xl.TQ, reportProc: Xl.EventProcType, reportData: REF ¬ NIL] RETURNS [teh: TEHandle]; <> <> <> GetFakeTime: PROC [teh: TEHandle] RETURNS [Xl.TimeStamp] = INLINE { <> <> <<-->> <<<>>> deltaTicks: CARD32 ~ actualTicks-teh.lastActualTicks; xTime: CARD32 ~ deltaTicks*mSecPerFastTick + LOOPHOLE[teh.lastActualTime, CARD32]; RETURN [LOOPHOLE[xTime]]; }; SetCorrectTime: PROC [teh: TEHandle, actualTime: Xl.TimeStamp] = INLINE { <> <> <<-->> IF (actualTime-teh.lastActualTime<>)>0 THEN teh.baseValid ¬ FALSE; teh.lastActualTime ¬ actualTime; }; Windup: PROC [teh: TEHandle] = INLINE { <> <> <<-->> teh.lastWound ¬ actualTicks; IF ~teh.active THEN RealActivate[teh]; }; <> TEHandleRec: PRIVATE TYPE = PRIVATE RECORD [ lastActualTime: Xl.TimeStamp ¬ Xl.currentTime, --base server-time reference lastActualTicks: CARD32 ¬ 0, --base tick-time reference (advanced by timer) lastWound: CARD32 ¬ 0, -- tq: Xl.TQ ¬ NIL, --client specified proc: Xl.EventProcType, --client specified data: REF ¬ NIL, --client specified active: BOOL ¬ FALSE, --event generation active baseValid: BOOL ¬ FALSE, --request to reset base tick-time reference enqueued: PRIVATE BOOL ¬ FALSE, --in queue considered on timer wakeup next: PRIVATE TEHandle ¬ NIL --list of queued TEHandles ]; actualTicks: PRIVATE READONLY CARD32; --slightly slow mSecPerFastTick: PRIVATE READONLY CARD32; RealActivate: PRIVATE PROC [teh: TEHandle]; END.