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) 36*97887027SBrian Tierney { 37*97887027SBrian Tierney //printf(" timer_expired: begining and end times are equal \n"); 38c5038eeaSkaustubhprabhu return 0; 39*97887027SBrian 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)); 800fdaab07SJon Dugan 81e434aab6SBrian Tierney if (gettimeofday(&tp->begin, NULL) < 0) 82e434aab6SBrian Tierney { 830fdaab07SJon Dugan perror("gettimeofday"); 840fdaab07SJon Dugan return NULL; 850fdaab07SJon Dugan } 860fdaab07SJon Dugan memcpy(&tp->end, &tp->begin, sizeof(struct timer)); 870fdaab07SJon Dugan tp->end.tv_sec = tp->begin.tv_sec + (time_t) sec; 880fdaab07SJon Dugan tp->end.tv_usec = tp->begin.tv_usec + (time_t) usec; 890fdaab07SJon Dugan 900fdaab07SJon Dugan tp->expired = timer_expired; 910fdaab07SJon Dugan 920fdaab07SJon Dugan return tp; 930fdaab07SJon Dugan } 940fdaab07SJon Dugan 950fdaab07SJon Dugan void 960fdaab07SJon Dugan free_timer(struct timer * tp) 970fdaab07SJon Dugan { 980fdaab07SJon Dugan free(tp); 990fdaab07SJon Dugan } 1000fdaab07SJon Dugan 1010fdaab07SJon Dugan int 1020fdaab07SJon Dugan delay(int64_t ns) 1030fdaab07SJon Dugan { 1040fdaab07SJon Dugan struct timespec req, rem; 1050fdaab07SJon Dugan 1060fdaab07SJon Dugan req.tv_sec = 0; 1070fdaab07SJon Dugan 1080fdaab07SJon Dugan while (ns >= 1000000000L) 1090fdaab07SJon Dugan { 1100fdaab07SJon Dugan ns -= 1000000000L; 1110fdaab07SJon Dugan req.tv_sec += 1; 1120fdaab07SJon Dugan } 1130fdaab07SJon Dugan 1140fdaab07SJon Dugan req.tv_nsec = ns; 1150fdaab07SJon Dugan 1160fdaab07SJon Dugan while (nanosleep(&req, &rem) == -1) 1170fdaab07SJon Dugan if (EINTR == errno) 1180fdaab07SJon Dugan memcpy(&req, &rem, sizeof rem); 1190fdaab07SJon Dugan else 1200fdaab07SJon Dugan return -1; 1210fdaab07SJon Dugan return 0; 1220fdaab07SJon Dugan } 1230fdaab07SJon Dugan 124a7253334SBrian Tierney # ifdef DELAY_SELECT_METHOD 125a7253334SBrian Tierney int 126a7253334SBrian Tierney delay(int us) 127a7253334SBrian Tierney { 128a7253334SBrian Tierney struct timeval tv; 129a7253334SBrian Tierney 130a7253334SBrian Tierney tv.tv_sec = 0; 131a7253334SBrian Tierney tv.tv_usec = us; 132a7253334SBrian Tierney (void) select(1, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &tv); 133a7253334SBrian Tierney return (1); 134a7253334SBrian Tierney } 135a7253334SBrian Tierney #endif 136a7253334SBrian Tierney 137c6ffef11Skaustubhprabhu int64_t 138c6ffef11Skaustubhprabhu timer_remaining(struct timer * tp) 139c6ffef11Skaustubhprabhu { 140c6ffef11Skaustubhprabhu struct timeval now; 1417dd1f0cdSkaustubhprabhu long int end_time = 0, current_time = 0, diff = 0; 142e434aab6SBrian Tierney if (gettimeofday(&now, NULL) < 0) 143e434aab6SBrian Tierney { 144c6ffef11Skaustubhprabhu perror("gettimeofday"); 145c6ffef11Skaustubhprabhu return -1; 146c6ffef11Skaustubhprabhu } 1477dd1f0cdSkaustubhprabhu end_time += tp->end.tv_sec * 1000000; 1487dd1f0cdSkaustubhprabhu end_time += tp->end.tv_usec; 149c6ffef11Skaustubhprabhu 1507dd1f0cdSkaustubhprabhu current_time += now.tv_sec * 1000000; 1517dd1f0cdSkaustubhprabhu current_time += now.tv_usec; 152c6ffef11Skaustubhprabhu 1537dd1f0cdSkaustubhprabhu diff = end_time - current_time; 154c6ffef11Skaustubhprabhu if (diff > 0) 155c6ffef11Skaustubhprabhu return diff; 156c6ffef11Skaustubhprabhu else 157c6ffef11Skaustubhprabhu return 0; 158c6ffef11Skaustubhprabhu } 159