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