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