(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* Last Modified On Sun May 27 09:36:52 1990 By muller *) UNSAFE MODULE Time; FROM Thread IMPORT Alerted; IMPORT ThreadF; FROM CoreOS IMPORT struct_timeval, struct_timezone, gettimeofday, settimeofday; PROCEDURE Pause (interval: CARDINAL) RAISES {Alerted} = VAR t: T := Now (); BEGIN INC (t.microseconds, interval MOD 1000000); INC (t.seconds, interval DIV 1000000); IF (t.microseconds >= 1000000) THEN DEC (t.microseconds, 1000000); INC (t.seconds); END; ThreadF.Pause (t); END Pause; PROCEDURE LongPause (interval: CARDINAL) RAISES {Alerted} = VAR t: T := Now (); BEGIN INC (t.seconds, interval); ThreadF.Pause (t); END LongPause; PROCEDURE PauseUntil (t: T) RAISES {Alerted} = BEGIN ThreadF.Pause (t); END PauseUntil; PROCEDURE Now (): T = VAR tv: T; tz: TimeZone; BEGIN EVAL gettimeofday (LOOPHOLE (tv, struct_timeval), LOOPHOLE (tz, struct_timezone)); RETURN tv; END Now; PROCEDURE ClockGrain (): Microseconds = BEGIN RETURN 10000; END ClockGrain; PROCEDURE Add (t1, t2: T): T = VAR res: T; BEGIN res.seconds := t1.seconds + t2.seconds; res.microseconds := t1.microseconds + t2.microseconds; IF res.microseconds > 1000000 THEN DEC (res.microseconds, 1000000); INC (res.seconds, 1); END; RETURN res; END Add; PROCEDURE Subtract (t1, t2: T): T = VAR res: T; BEGIN res.seconds := t1.seconds - t2.seconds; res.microseconds := t1.microseconds - t2.microseconds; IF res.microseconds < 0 THEN INC (res.microseconds, 1000000); DEC (res.seconds, 1); END; RETURN res; END Subtract; PROCEDURE Compare (t1, t2: T): [-1 .. 1] = BEGIN IF t1.seconds > t2.seconds THEN RETURN 1; ELSIF t1.seconds = t2.seconds THEN IF t1.microseconds > t2.microseconds THEN RETURN 1; ELSIF t1.microseconds = t2.microseconds THEN RETURN 0; ELSE RETURN -1; END; ELSE RETURN -1 END; END Compare; PROCEDURE GetTimeZone (): TimeZone = VAR tv: T; tz: TimeZone; BEGIN EVAL gettimeofday (LOOPHOLE (tv, struct_timeval), LOOPHOLE (tz, struct_timezone)); RETURN tz; END GetTimeZone; PROCEDURE SetTime (tv: T; tz: TimeZone) RAISES {NoPrivileges} = BEGIN IF settimeofday (LOOPHOLE (tv, struct_timeval), LOOPHOLE (tz, struct_timezone)) = -1 THEN RAISE NoPrivileges; END; END SetTime; BEGIN END Time.