xref: /iperf/src/timer.c (revision 0fdaab07)
1*0fdaab07SJon Dugan #include <stdio.h>
2*0fdaab07SJon Dugan #include <stdlib.h>
3*0fdaab07SJon Dugan #include <string.h>
4*0fdaab07SJon Dugan #include <sys/time.h>
5*0fdaab07SJon Dugan #include <sys/errno.h>
6*0fdaab07SJon Dugan #include <sys/types.h>
7*0fdaab07SJon Dugan #include <stdint.h>
8*0fdaab07SJon Dugan #include <time.h>
9*0fdaab07SJon Dugan 
10*0fdaab07SJon Dugan #include "timer.h"
11*0fdaab07SJon Dugan 
12*0fdaab07SJon Dugan int
13*0fdaab07SJon Dugan timer_expired(struct timer *tp)
14*0fdaab07SJon Dugan {
15*0fdaab07SJon Dugan     struct timeval now;
16*0fdaab07SJon Dugan     if(gettimeofday(&now, NULL) < 0) {
17*0fdaab07SJon Dugan         perror("gettimeofday");
18*0fdaab07SJon Dugan         return -1;
19*0fdaab07SJon Dugan     }
20*0fdaab07SJon Dugan 
21*0fdaab07SJon Dugan     return tp->end.tv_sec <= now.tv_sec;
22*0fdaab07SJon Dugan }
23*0fdaab07SJon Dugan 
24*0fdaab07SJon Dugan struct timer *
25*0fdaab07SJon Dugan new_timer(time_t sec, suseconds_t usec)
26*0fdaab07SJon Dugan {
27*0fdaab07SJon Dugan     struct timer *tp;
28*0fdaab07SJon Dugan     tp = (struct timer *) malloc(sizeof(struct timer));
29*0fdaab07SJon Dugan 
30*0fdaab07SJon Dugan     if(gettimeofday(&tp->begin, NULL) < 0) {
31*0fdaab07SJon Dugan         perror("gettimeofday");
32*0fdaab07SJon Dugan         return NULL;
33*0fdaab07SJon Dugan     }
34*0fdaab07SJon Dugan 
35*0fdaab07SJon Dugan     memcpy(&tp->end, &tp->begin, sizeof(struct timer));
36*0fdaab07SJon Dugan     tp->end.tv_sec = tp->begin.tv_sec + (time_t) sec;
37*0fdaab07SJon Dugan     tp->end.tv_usec = tp->begin.tv_usec + (time_t) usec;
38*0fdaab07SJon Dugan 
39*0fdaab07SJon Dugan     tp->expired = timer_expired;
40*0fdaab07SJon Dugan 
41*0fdaab07SJon Dugan     return tp;
42*0fdaab07SJon Dugan }
43*0fdaab07SJon Dugan 
44*0fdaab07SJon Dugan void
45*0fdaab07SJon Dugan free_timer(struct timer *tp)
46*0fdaab07SJon Dugan {
47*0fdaab07SJon Dugan     free(tp);
48*0fdaab07SJon Dugan }
49*0fdaab07SJon Dugan 
50*0fdaab07SJon Dugan int
51*0fdaab07SJon Dugan delay(int64_t ns)
52*0fdaab07SJon Dugan {
53*0fdaab07SJon Dugan     struct timespec req, rem;
54*0fdaab07SJon Dugan 
55*0fdaab07SJon Dugan     req.tv_sec = 0;
56*0fdaab07SJon Dugan 
57*0fdaab07SJon Dugan     while(ns >= 1000000000L)
58*0fdaab07SJon Dugan     {
59*0fdaab07SJon Dugan         ns -= 1000000000L;
60*0fdaab07SJon Dugan         req.tv_sec += 1;
61*0fdaab07SJon Dugan     }
62*0fdaab07SJon Dugan 
63*0fdaab07SJon Dugan     req.tv_nsec = ns;
64*0fdaab07SJon Dugan 
65*0fdaab07SJon Dugan     while(nanosleep(&req, &rem) == -1 )
66*0fdaab07SJon Dugan         if (EINTR == errno)
67*0fdaab07SJon Dugan             memcpy(&req, &rem, sizeof rem);
68*0fdaab07SJon Dugan         else
69*0fdaab07SJon Dugan             return -1;
70*0fdaab07SJon Dugan 
71*0fdaab07SJon Dugan     return 0;
72*0fdaab07SJon Dugan }
73*0fdaab07SJon Dugan 
74