<<>> <> <> <> <<>> DIRECTORY BasicTime, BootTime; BootTimeImpl: CEDAR PROGRAM IMPORTS BasicTime EXPORTS BootTime ~ BEGIN bootTimeComputed: BOOL ¬ FALSE; bootTime: BasicTime.GMT ¬ BasicTime.nullGMT; Get: PUBLIC PROC RETURNS [BasicTime.GMT] ~ { IF NOT bootTimeComputed THEN { enow: BasicTime.ExtendedGMT ~ BasicTime.ExtendedNow[]; ticksSinceBoot: CARD ~ GetTicksSinceBoot[]; msSinceBoot: CARD ~ TicksToMsec[ticksSinceBoot]; dms: INT ~ INT[enow.usecs/1000] - INT[msSinceBoot]; ds: INT ~ dms/1000; bootTime ¬ enow.gmt.Update[ds]; bootTimeComputed ¬ TRUE }; RETURN [bootTime] }; GetTicksSinceBoot: PROC RETURNS [CARD] = TRUSTED MACHINE CODE {"XR_TicksSinceBoot"}; TicksToMsec: PROC [CARD] RETURNS [CARD] = TRUSTED MACHINE CODE {"XR_TicksToMsec"}; END. <<>>