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 4/19/24)

     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 4/19/24)