xref: /iperf/src/timer.c (revision f4e1c1d4)
10fdaab07SJon Dugan #include <stdio.h>
20fdaab07SJon Dugan #include <stdlib.h>
30fdaab07SJon Dugan #include <string.h>
40fdaab07SJon Dugan #include <sys/time.h>
50fdaab07SJon Dugan #include <sys/errno.h>
60fdaab07SJon Dugan #include <sys/types.h>
70fdaab07SJon Dugan #include <stdint.h>
80fdaab07SJon Dugan #include <time.h>
90fdaab07SJon Dugan 
100fdaab07SJon Dugan #include "timer.h"
110fdaab07SJon Dugan 
1281a2df59Skaustubhprabhu 
1381a2df59Skaustubhprabhu 
14c6ffef11Skaustubhprabhu double
15c6ffef11Skaustubhprabhu timeval_to_double(struct timeval * tv)
1681a2df59Skaustubhprabhu {
1781a2df59Skaustubhprabhu     double    d;
1881a2df59Skaustubhprabhu 
1981a2df59Skaustubhprabhu     d = tv->tv_sec + tv->tv_usec / 1000000;
2081a2df59Skaustubhprabhu 
2181a2df59Skaustubhprabhu     return d;
2281a2df59Skaustubhprabhu }
2381a2df59Skaustubhprabhu 
24c6ffef11Skaustubhprabhu double
25c6ffef11Skaustubhprabhu timeval_diff(struct timeval * tv0, struct timeval * tv1)
2681a2df59Skaustubhprabhu {
27f4ca73a1Skaustubhprabhu     //return timeval_to_double(tv1) - timeval_to_double(tv0);
28f4ca73a1Skaustubhprabhu     return (tv1->tv_sec - tv0->tv_sec) + abs(tv1->tv_usec - tv0->tv_usec) / 1000000.0;
2981a2df59Skaustubhprabhu }
3081a2df59Skaustubhprabhu 
310fdaab07SJon Dugan int
320fdaab07SJon Dugan timer_expired(struct timer * tp)
330fdaab07SJon Dugan {
34e434aab6SBrian Tierney     /* for timer with zero time */
35c5038eeaSkaustubhprabhu     if (tp->end.tv_sec == tp->begin.tv_sec && tp->end.tv_usec == tp->begin.tv_usec)
3697887027SBrian Tierney     {
3797887027SBrian Tierney 	//printf(" timer_expired: begining and end times are equal \n");
38c5038eeaSkaustubhprabhu 	return 0;
3997887027SBrian Tierney     }
40c5038eeaSkaustubhprabhu 
410fdaab07SJon Dugan     struct timeval now;
4281a2df59Skaustubhprabhu     int64_t   end = 0, current = 0, diff = 0;
43da54a271SBrian Tierney 
44da54a271SBrian Tierney     //printf("checking if timer has expired \n");
45e434aab6SBrian Tierney     if (gettimeofday(&now, NULL) < 0)
46e434aab6SBrian Tierney     {
47aa9ca268Skaustubhprabhu 	perror("gettimeofday");
48aa9ca268Skaustubhprabhu 	return -1;
49aa9ca268Skaustubhprabhu     }
5081a2df59Skaustubhprabhu     end += tp->end.tv_sec * 1000000;
5181a2df59Skaustubhprabhu     end += tp->end.tv_usec;
52aa9ca268Skaustubhprabhu 
53aa9ca268Skaustubhprabhu     current += now.tv_sec * 1000000;
54aa9ca268Skaustubhprabhu     current += now.tv_usec;
55aa9ca268Skaustubhprabhu 
5681a2df59Skaustubhprabhu     diff = end - current;
5781a2df59Skaustubhprabhu     return diff <= 0;
58aa9ca268Skaustubhprabhu 
59aa9ca268Skaustubhprabhu }
60aa9ca268Skaustubhprabhu 
61c6ffef11Skaustubhprabhu void
62c6ffef11Skaustubhprabhu update_timer(struct timer * tp, time_t sec, suseconds_t usec)
63c6ffef11Skaustubhprabhu {
64e434aab6SBrian Tierney     if (gettimeofday(&tp->begin, NULL) < 0)
65e434aab6SBrian Tierney     {
66c6ffef11Skaustubhprabhu 	perror("gettimeofday");
67c6ffef11Skaustubhprabhu     }
68c6ffef11Skaustubhprabhu     memcpy(&tp->end, &tp->begin, sizeof(struct timer));
69c6ffef11Skaustubhprabhu     tp->end.tv_sec = tp->begin.tv_sec + (time_t) sec;
70c6ffef11Skaustubhprabhu     tp->end.tv_usec = tp->begin.tv_usec + (time_t) usec;
71c6ffef11Skaustubhprabhu 
72c6ffef11Skaustubhprabhu     tp->expired = timer_expired;
73c6ffef11Skaustubhprabhu }
74aa9ca268Skaustubhprabhu 
750fdaab07SJon Dugan struct timer *
760fdaab07SJon Dugan new_timer(time_t sec, suseconds_t usec)
770fdaab07SJon Dugan {
780fdaab07SJon Dugan     struct timer *tp;
790fdaab07SJon Dugan     tp = (struct timer *) malloc(sizeof(struct timer));
80*f4e1c1d4SBrian Tierney     if (tp == NULL)
81*f4e1c1d4SBrian Tierney     {
82*f4e1c1d4SBrian Tierney 	perror("malloc");
83*f4e1c1d4SBrian Tierney 	return NULL;
84*f4e1c1d4SBrian Tierney     }
850fdaab07SJon Dugan 
86e434aab6SBrian Tierney     if (gettimeofday(&tp->begin, NULL) < 0)
87e434aab6SBrian Tierney     {
880fdaab07SJon Dugan 	perror("gettimeofday");
890fdaab07SJon Dugan 	return NULL;
900fdaab07SJon Dugan     }
910fdaab07SJon Dugan     memcpy(&tp->end, &tp->begin, sizeof(struct timer));
920fdaab07SJon Dugan     tp->end.tv_sec = tp->begin.tv_sec + (time_t) sec;
930fdaab07SJon Dugan     tp->end.tv_usec = tp->begin.tv_usec + (time_t) usec;
940fdaab07SJon Dugan 
950fdaab07SJon Dugan     tp->expired = timer_expired;
960fdaab07SJon Dugan 
970fdaab07SJon Dugan     return tp;
980fdaab07SJon Dugan }
990fdaab07SJon Dugan 
1000fdaab07SJon Dugan void
1010fdaab07SJon Dugan free_timer(struct timer * tp)
1020fdaab07SJon Dugan {
1030fdaab07SJon Dugan     free(tp);
1040fdaab07SJon Dugan }
1050fdaab07SJon Dugan 
1060fdaab07SJon Dugan int
1070fdaab07SJon Dugan delay(int64_t ns)
1080fdaab07SJon Dugan {
1090fdaab07SJon Dugan     struct timespec req, rem;
1100fdaab07SJon Dugan 
1110fdaab07SJon Dugan     req.tv_sec = 0;
1120fdaab07SJon Dugan 
1130fdaab07SJon Dugan     while (ns >= 1000000000L)
1140fdaab07SJon Dugan     {
1150fdaab07SJon Dugan 	ns -= 1000000000L;
1160fdaab07SJon Dugan 	req.tv_sec += 1;
1170fdaab07SJon Dugan     }
1180fdaab07SJon Dugan 
1190fdaab07SJon Dugan     req.tv_nsec = ns;
1200fdaab07SJon Dugan 
1210fdaab07SJon Dugan     while (nanosleep(&req, &rem) == -1)
1220fdaab07SJon Dugan 	if (EINTR == errno)
1230fdaab07SJon Dugan 	    memcpy(&req, &rem, sizeof rem);
1240fdaab07SJon Dugan 	else
1250fdaab07SJon Dugan 	    return -1;
1260fdaab07SJon Dugan     return 0;
1270fdaab07SJon Dugan }
1280fdaab07SJon Dugan 
129a7253334SBrian Tierney # ifdef DELAY_SELECT_METHOD
130a7253334SBrian Tierney int
131a7253334SBrian Tierney delay(int us)
132a7253334SBrian Tierney {
133a7253334SBrian Tierney     struct timeval tv;
134a7253334SBrian Tierney 
135a7253334SBrian Tierney     tv.tv_sec = 0;
136a7253334SBrian Tierney     tv.tv_usec = us;
137a7253334SBrian Tierney     (void) select(1, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &tv);
138a7253334SBrian Tierney     return (1);
139a7253334SBrian Tierney }
140a7253334SBrian Tierney #endif
141a7253334SBrian Tierney 
142c6ffef11Skaustubhprabhu int64_t
143c6ffef11Skaustubhprabhu timer_remaining(struct timer * tp)
144c6ffef11Skaustubhprabhu {
145c6ffef11Skaustubhprabhu     struct timeval now;
1467dd1f0cdSkaustubhprabhu     long int  end_time = 0, current_time = 0, diff = 0;
147e434aab6SBrian Tierney     if (gettimeofday(&now, NULL) < 0)
148e434aab6SBrian Tierney     {
149c6ffef11Skaustubhprabhu 	perror("gettimeofday");
150c6ffef11Skaustubhprabhu 	return -1;
151c6ffef11Skaustubhprabhu     }
1527dd1f0cdSkaustubhprabhu     end_time += tp->end.tv_sec * 1000000;
1537dd1f0cdSkaustubhprabhu     end_time += tp->end.tv_usec;
154c6ffef11Skaustubhprabhu 
1557dd1f0cdSkaustubhprabhu     current_time += now.tv_sec * 1000000;
1567dd1f0cdSkaustubhprabhu     current_time += now.tv_usec;
157c6ffef11Skaustubhprabhu 
1587dd1f0cdSkaustubhprabhu     diff = end_time - current_time;
159c6ffef11Skaustubhprabhu     if (diff > 0)
160c6ffef11Skaustubhprabhu 	return diff;
161c6ffef11Skaustubhprabhu     else
162c6ffef11Skaustubhprabhu 	return 0;
163c6ffef11Skaustubhprabhu }
164