1/*
2 * delay.c
3 *
4 * implementation of delay API
5 */
6
7#include <sys/time.h>
8#include <string.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <errno.h>
12
13#include "delay.h"
14
15int delay_is_running = 0;
16
17sig_atomic_t delay_timeout;
18
19extern int verbose;
20
21void delay_setup_fixed (struct itimerval *delay, int delay_secs)
22{
23
24  memset(delay, 0, sizeof(struct itimerval));
25
26  if (verbose)
27    fprintf(stderr, "delay fixed for %d\n", delay_secs);
28
29  delay->it_value.tv_sec = delay_secs;
30
31}
32
33void delay_setup_random(struct itimerval *delay,
34			int delay_min_secs,
35			int delay_max_secs)
36{
37
38  long delay_usecs;
39  long delay_rand;
40  long delay_usec_range;
41
42  memset(delay, 0, sizeof(struct itimerval));
43
44  /* compute the delay time in usecs */
45  delay_rand = abs(random());
46
47  delay_usec_range = (delay_max_secs - delay_min_secs) * 100;
48
49  delay_usecs = (delay_rand % delay_usec_range) + (delay_min_secs * 100);
50
51  delay->it_value.tv_usec = delay_usecs % 100;
52  delay->it_value.tv_sec  = delay_usecs - delay->it_value.tv_usec;
53
54  if (delay->it_value.tv_sec)
55    delay->it_value.tv_sec = delay->it_value.tv_sec / 100;
56
57  if (verbose)
58    fprintf(stderr, "delay random for %ld.%ld\n",
59	    delay->it_value.tv_sec,
60	    delay->it_value.tv_usec);
61
62}
63
64void delay_setup_immed(struct itimerval *delay)
65{
66
67  memset(delay, 0, sizeof(struct itimerval));
68
69  delay->it_value.tv_usec = 1;
70}
71
72void delay_run         (struct itimerval *delay)
73{
74  if (!delay_is_running) {
75    setitimer(ITIMER_REAL, delay, NULL);
76    delay_timeout = 0;
77    delay_is_running = 1;
78  }
79}
80
81/* delay_wait defined in delay.h */
82#if 0
83void delay_wait        (void)
84{
85  if (!delay_timeout)
86    continue;
87
88  delay_is_running = 0;
89}
90#endif
91
92int  delay_is_waiting  (void)
93{
94  if ((delay_timeout == 0) && (delay_is_running))
95    return 1;
96
97  return 0;
98}
99
100void delay_cancel      (void)
101{
102  if (setitimer(ITIMER_REAL, NULL, NULL) < 0) {
103    fprintf(stderr, "failed to cancel timer: %s\n", strerror(errno));
104  }
105
106  delay_timeout = 0;
107  delay_is_running = 0;
108
109}
110