#include #include #include #define NANOSEC 1000000000.0 #define MILLISEC 1000 int displaytimer=0; static struct timespec start; void start_timer() { printf("timer started...\n"); clock_gettime(CLOCK_MONOTONIC, &start); # ifdef DEBUG_TIMER printf("sec=%d nsec=%d\n", start.tv_sec, start.tv_nsec); # endif } void set_timer(timer) struct timespec *timer; { clock_gettime(CLOCK_MONOTONIC, timer); # ifdef DEBUG_TIMER printf("timer: sec=%d nsec=%d orig: sec=%ld nsec=%ld\n", timer->tv_sec, timer->tv_nsec, start.tv_sec, start.tv_nsec); # endif } double get_timer(timer) struct timespec timer; { double diff; diff=(timer.tv_sec - start.tv_sec) + (timer.tv_nsec - start.tv_nsec) / NANOSEC; # ifdef DEBUG_TIMER printf("timer sec: %.5f\n", diff); # endif return diff; } #ifdef STANDALONE int main(ac, av) int ac; char **av; { int delay; struct timespec end, tsdelay; if (ac != 2) { fprintf(stderr, "usage: %s msecs\n", *av); exit (1); } delay=atoi(*(av+1)); start_timer(); tsdelay.tv_sec=delay/MILLISEC; tsdelay.tv_nsec=delay%MILLISEC; printf("delay %d=%ld:%ld\n", delay, tsdelay.tv_sec, tsdelay.tv_nsec); nanosleep(&tsdelay, NULL); set_timer(&end); printf("Time elapsed: %.5f seconds\n", get_timer(end)); return 0; } #endif