home *** CD-ROM | disk | FTP | other *** search
/ Dr. CD ROM (Annual Premium Edition) / premium.zip / premium / WINUTIL2 / UWSERVER.ZIP / UWSERVER.TAR / server / uw_clk.c < prev    next >
C/C++ Source or Header  |  1991-01-25  |  2KB  |  89 lines

  1. /*
  2.  *    uw_clk - timer support for UW
  3.  *
  4.  * Copyright 1986 by John D. Bruner.  All rights reserved.  Permission to
  5.  * copy this program is given provided that the copy is not sold and that
  6.  * this copyright notice is included.
  7.  */
  8.  
  9. #include <sys/types.h>
  10. #include <sys/time.h>
  11. #include <sys/signal.h>
  12. #include <sys/resource.h>
  13.  
  14. #include "uw_param.h"
  15. #include "uw_clk.h"
  16.  
  17. static struct timeout *pending;
  18. static struct timeout *freelist;
  19.  
  20. int timer_rdy;            /* nonzero when some timeout is ready to run */
  21.  
  22. clk_timeout(secs, fn, arg)
  23. int secs;
  24. void (*fn)();
  25. toarg_t arg;
  26. {
  27.     register struct timeout *to, **tol;
  28.     register time_t curtime;
  29.     extern time_t time();
  30.  
  31.     to = freelist;
  32.     if (!to) {
  33.         if (!(to = (struct timeout *)malloc(sizeof *to)))
  34.             return(-1);
  35.     } else
  36.         freelist = to->to_next;
  37.     to->to_fn = fn;
  38.     to->to_arg = arg;
  39.  
  40.     if (secs < 0)
  41.         secs = 0;
  42.     curtime = time((time_t *)0);
  43.     to->to_when = curtime + secs;
  44.  
  45.     tol = &pending;
  46.     while (*tol && to->to_when > (*tol)->to_when)
  47.         tol = &(*tol)->to_next;
  48.     to->to_next = *tol;
  49.     *tol = to;
  50.  
  51.     clk_service();
  52.     return(0);
  53. }
  54.  
  55. clk_service()
  56. {
  57.     register struct timeout *to;
  58.     register time_t curtime;
  59.  
  60.     curtime = time((time_t *)0);
  61.     while ((to=pending) && to->to_when <= curtime) {
  62.         pending = to->to_next;
  63.         if (to->to_fn) {
  64.             (*to->to_fn)(to->to_arg);
  65.             to->to_next = freelist;
  66.             freelist = to;
  67.         }
  68.     }
  69.  
  70.     timer_rdy = 0;
  71.     if (pending)
  72.         (void)alarm((unsigned)(pending->to_when - curtime));
  73. }
  74.  
  75. void
  76. clk_alarm()
  77. {
  78.     /*
  79.      * A SIGALRM has been received.
  80.      */
  81.     timer_rdy = 1;
  82. }
  83.  
  84. clk_init()
  85. {
  86.     timer_rdy = 0;
  87.     (void)signal(SIGALRM, clk_alarm);
  88. }
  89.