TIMERS(2) TIMERS(2) NAME timers - interval timers SYNOPSIS include "timers.m"; timers := load Timers Timers->PATH; Timer: adt { timeout: chan of int; start: fn(msec: int): ref Timer; stop: fn(t: self ref Timer); }; init: fn(minms: int): int; shutdown: fn(); DESCRIPTION Timers provides simple interval timing. Timeouts are noti- fied by a message sent on a channel, allowing them to pro- vide timeouts in alt statements. The module must first be initialised by calling init, which starts a process to manage the interval timers and returns its process ID. Before exit, the caller must shut the tim- ing process down either by calling shutdown, which stops it synchronously; by using the process ID returned by init to kill it; or by killing the process group of the process that called init (since the timing processes remain in that group). Minms gives the minimum granularity of timing requests in milliseconds. Timer.start(msec) Returns a Timer that will expire in msec milliseconds, measured with the granularity of either sys-sleep(2) or the granularity set by init, whichever is greater. t.timeout An arbitrary integer value is sent on this channel when the timer t expires. t.stop() The timer t is stopped and removed from the interval timing queue, if it has not already expired. Each Timer value times a single interval. When a timer t expires, the timing process attempts, at that and each sub- sequent timing interval, to send on t.timeout until the expiry message is delivered or the timer is stopped. Page 1 Plan 9 (printed 1/3/25) TIMERS(2) TIMERS(2) EXAMPLE Wait for data to be sent on an input channel, but give up if it does not arrive within 600 milliseconds: t := Timer.start(600); alt { data := <-input => t.stop(); # process the data <-t.timeout => # request timed out } SEE ALSO sys-millisec(2), sys-sleep(2) Page 2 Plan 9 (printed 1/3/25)