-- TimerImpl.mesa
-- Last Modified On 22-Dec-81 15:49:49 By Paul Rovner
DIRECTORY
ShowTime USING[Microseconds, GetMark],
Timer USING[Seconds];
TimerImpl: MONITOR
LOCKS self USING self: Handle
IMPORTS ShowTime
EXPORTS Timer
= {
--TYPEs
Handle: TYPE = REF Object;
Object: PUBLIC TYPE = MONITORED RECORD[bigBangTime, previousMark: ShowTime.Microseconds,
secondsSinceFirstBigBang: Seconds ← 0.0];
Seconds: TYPE = Timer.Seconds; -- REAL--
-- PROCEDUREs
Create: PUBLIC PROC RETURNS[Handle] =
{startMark: ShowTime.Microseconds = ShowTime.GetMark[];
RETURN[NEW[Object ← [LOCK:,
bigBangTime: startMark,
previousMark: startMark]]]};
Read: PUBLIC ENTRY PROC[self: Handle]
RETURNS[time, deltaTime: Seconds] =
{nextMark: ShowTime.Microseconds ← ShowTime.GetMark[];
IF nextMark - self.bigBangTime > 10000000000B -- 30 bits, ~20 mins
THEN {self.secondsSinceFirstBigBang ← self.secondsSinceFirstBigBang + (self.previousMark-self.bigBangTime)*1.0E-6;
self.bigBangTime ← self.previousMark};
deltaTime ← (nextMark - self.previousMark)*1.0E-6;
time ← (nextMark-self.bigBangTime)*1.0E-6 + self.secondsSinceFirstBigBang;
self.previousMark ← nextMark};
Reset: PUBLIC ENTRY PROC[self: Handle] =
{startMark: ShowTime.Microseconds = ShowTime.GetMark[];
self.bigBangTime ← self.previousMark ← startMark;
self.secondsSinceFirstBigBang ← 0.0};
}.