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 tp->end.tv_sec = tp->begin.tv_sec + (time_t) sec; 69c6ffef11Skaustubhprabhu tp->end.tv_usec = tp->begin.tv_usec + (time_t) usec; 70c6ffef11Skaustubhprabhu 71c6ffef11Skaustubhprabhu tp->expired = timer_expired; 72c6ffef11Skaustubhprabhu } 73aa9ca268Skaustubhprabhu 740fdaab07SJon Dugan struct timer * 750fdaab07SJon Dugan new_timer(time_t sec, suseconds_t usec) 760fdaab07SJon Dugan { 77*dfb2d9d4SBrian Tierney struct timer *tp = NULL; 78*dfb2d9d4SBrian Tierney tp = (struct timer *) calloc(1, sizeof(struct timer)); 79f4e1c1d4SBrian Tierney if (tp == NULL) 80f4e1c1d4SBrian Tierney { 81f4e1c1d4SBrian Tierney perror("malloc"); 82f4e1c1d4SBrian Tierney return NULL; 83f4e1c1d4SBrian Tierney } 840fdaab07SJon Dugan 85e434aab6SBrian Tierney if (gettimeofday(&tp->begin, NULL) < 0) 86e434aab6SBrian Tierney { 870fdaab07SJon Dugan perror("gettimeofday"); 880fdaab07SJon Dugan return NULL; 890fdaab07SJon Dugan } 90*dfb2d9d4SBrian Tierney 910fdaab07SJon Dugan tp->end.tv_sec = tp->begin.tv_sec + (time_t) sec; 920fdaab07SJon Dugan tp->end.tv_usec = tp->begin.tv_usec + (time_t) usec; 930fdaab07SJon Dugan 940fdaab07SJon Dugan tp->expired = timer_expired; 950fdaab07SJon Dugan 960fdaab07SJon Dugan return tp; 970fdaab07SJon Dugan } 980fdaab07SJon Dugan 990fdaab07SJon Dugan void 1000fdaab07SJon Dugan free_timer(struct timer * tp) 1010fdaab07SJon Dugan { 1020fdaab07SJon Dugan free(tp); 1030fdaab07SJon Dugan } 1040fdaab07SJon Dugan 1050fdaab07SJon Dugan int 1060fdaab07SJon Dugan delay(int64_t ns) 1070fdaab07SJon Dugan { 1080fdaab07SJon Dugan struct timespec req, rem; 1090fdaab07SJon Dugan 1100fdaab07SJon Dugan req.tv_sec = 0; 1110fdaab07SJon Dugan 1120fdaab07SJon Dugan while (ns >= 1000000000L) 1130fdaab07SJon Dugan { 1140fdaab07SJon Dugan ns -= 1000000000L; 1150fdaab07SJon Dugan req.tv_sec += 1; 1160fdaab07SJon Dugan } 1170fdaab07SJon Dugan 1180fdaab07SJon Dugan req.tv_nsec = ns; 1190fdaab07SJon Dugan 1200fdaab07SJon Dugan while (nanosleep(&req, &rem) == -1) 1210fdaab07SJon Dugan if (EINTR == errno) 1220fdaab07SJon Dugan memcpy(&req, &rem, sizeof rem); 1230fdaab07SJon Dugan else 1240fdaab07SJon Dugan return -1; 1250fdaab07SJon Dugan return 0; 1260fdaab07SJon Dugan } 1270fdaab07SJon Dugan 128a7253334SBrian Tierney # ifdef DELAY_SELECT_METHOD 129a7253334SBrian Tierney int 130a7253334SBrian Tierney delay(int us) 131a7253334SBrian Tierney { 132a7253334SBrian Tierney struct timeval tv; 133a7253334SBrian Tierney 134a7253334SBrian Tierney tv.tv_sec = 0; 135a7253334SBrian Tierney tv.tv_usec = us; 136a7253334SBrian Tierney (void) select(1, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &tv); 137a7253334SBrian Tierney return (1); 138a7253334SBrian Tierney } 139a7253334SBrian Tierney #endif 140a7253334SBrian Tierney 141c6ffef11Skaustubhprabhu int64_t 142c6ffef11Skaustubhprabhu timer_remaining(struct timer * tp) 143c6ffef11Skaustubhprabhu { 144c6ffef11Skaustubhprabhu struct timeval now; 1457dd1f0cdSkaustubhprabhu long int end_time = 0, current_time = 0, diff = 0; 146e434aab6SBrian Tierney if (gettimeofday(&now, NULL) < 0) 147e434aab6SBrian Tierney { 148c6ffef11Skaustubhprabhu perror("gettimeofday"); 149c6ffef11Skaustubhprabhu return -1; 150c6ffef11Skaustubhprabhu } 1517dd1f0cdSkaustubhprabhu end_time += tp->end.tv_sec * 1000000; 1527dd1f0cdSkaustubhprabhu end_time += tp->end.tv_usec; 153c6ffef11Skaustubhprabhu 1547dd1f0cdSkaustubhprabhu current_time += now.tv_sec * 1000000; 1557dd1f0cdSkaustubhprabhu current_time += now.tv_usec; 156c6ffef11Skaustubhprabhu 1577dd1f0cdSkaustubhprabhu diff = end_time - current_time; 158c6ffef11Skaustubhprabhu if (diff > 0) 159c6ffef11Skaustubhprabhu return diff; 160c6ffef11Skaustubhprabhu else 161c6ffef11Skaustubhprabhu return 0; 162c6ffef11Skaustubhprabhu } 163