home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume6 / xplumb / part01 / timer.C < prev   
C/C++ Source or Header  |  1990-04-11  |  3KB  |  141 lines

  1. /*
  2.  * Copyright 1990 Digital Equipment Corporation
  3.  *
  4.  * Permission to use, copy, modify, and distribute this software and its
  5.  * documentation for any purpose and without fee is hereby granted,
  6.  * provided that the above copyright notice appear in all copies and that
  7.  * both that copyright notice and this permission notice appear in
  8.  * supporting documentation, and that the name of Digital Equipment
  9.  * Corporation not be used in advertising or publicity pertaining to
  10.  * distribution of the software without specific, written prior
  11.  * permission.  Digital Equipment Corporation makes no representations
  12.  * about the suitability of this software for any purpose.  It is
  13.  * provided "as is" without express or implied warranty.
  14.  *
  15.  * DIGITAL EQUIPMENT CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
  16.  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17.  * FITNESS, IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR
  18.  * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  20.  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  21.  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  *
  23.  * Author:  Terry Weissman
  24.  *          weissman@wsl.dec.com
  25.  */
  26.  
  27. #include <sys/time.h>
  28. #include <sys/types.h>
  29. #include <sys/timeb.h>
  30.  
  31. extern void ftime(struct timeb *);
  32.  
  33. extern int select(int, int *, int *, int *, struct timeval *);
  34.  
  35. #ifndef NULL
  36. #define    NULL 0
  37. #endif NULL
  38.  
  39. static int starttime;
  40. static int paused = 0;
  41. static int pausetime;
  42.  
  43. struct InfoRec {
  44.     int when;
  45.     void (*func)(void *);
  46.     void *closure;
  47.     struct InfoRec *next;
  48. };
  49.  
  50. typedef struct InfoRec *Info;
  51.  
  52.  
  53. static Info first = NULL;
  54.  
  55.  
  56. static inline int GetCurrentTime() {
  57.     struct timeb t;
  58.     ftime(&t);
  59.     return ((t.time - starttime) * 1000 + t.millitm);
  60. }
  61.  
  62.  
  63.  
  64. void TimerAddTimeout(int msec, void (*func)(void *), void *closure) {
  65.     Info temp = new InfoRec();
  66.     temp->when = msec + GetCurrentTime();
  67.     temp->func = func;
  68.     temp->closure = closure;
  69.  
  70.     Info *t;
  71.  
  72.     t = &first;
  73.  
  74.     while (*t && (*t)->when <= temp->when) t = &((*t)->next);
  75.     temp->next = *t;
  76.     *t = temp;
  77. }
  78.  
  79. struct timeval *TimerGetInterval() {
  80.     if (!first || paused) return NULL;
  81.     static struct timeval result;
  82.     int msec = first->when - GetCurrentTime();
  83.     if (msec < 0) msec = 0;
  84.     result.tv_sec = msec / 1000;
  85.     result.tv_usec = (msec % 1000) * 1000;
  86.     return &result;
  87. }
  88.  
  89.  
  90. void TimerHandleTimeout() {
  91.     Info temp;
  92.     if (first) {
  93.     temp = first;
  94.     first = first->next;
  95.     (*temp->func)(temp->closure);
  96.     delete temp;
  97.     }
  98. }
  99.  
  100.  
  101. void TimerClearAll() {
  102.     Info temp;
  103.     while (first) {
  104.     temp = first;
  105.     first = first->next;
  106.     delete temp;
  107.     }
  108. }
  109.  
  110.  
  111. void TimerPause() {
  112.     if (!paused) {
  113.     paused = 1;
  114.     pausetime = GetCurrentTime();
  115.     }
  116. }
  117.  
  118. void TimerContinue() {
  119.     paused = 0;
  120.     pausetime -= GetCurrentTime();
  121.     Info temp;
  122.     for (temp = first ; temp ; temp = temp->next) {
  123.     temp->when += pausetime;
  124.     }
  125. }
  126.  
  127.  
  128. void TimerSleep(int msec) {
  129.     struct timeval t;
  130.     t.tv_sec = msec / 1000;
  131.     t.tv_usec = (msec % 1000) * 1000;
  132.     (void) select(1, NULL, NULL, NULL, &t);
  133. }
  134.  
  135.  
  136. void TimerInit() {
  137.     struct timeb t;
  138.     ftime(&t);
  139.     starttime = t.time;
  140. }
  141.