int main(int ac, char **av) { int i, tfd; long ticks; unsigned long long tnow, ttmr; u_int64_t uticks; struct itimerspec tmr; struct tmr_type clks[] = { #if defined(HAVE_CLOCK_MONOTONIC) { CLOCK_MONOTONIC, "CLOCK MONOTONIC" }, #endif { CLOCK_REALTIME, "CLOCK REALTIME" }, }; for (i = 0; i < sizeof(clks) / sizeof(clks[0]); i++) { fprintf(stdout, "\n\n---------------------------------------\n"); fprintf(stdout, "| testing %s\n", clks[i].name); fprintf(stdout, "---------------------------------------\n\n"); fprintf(stdout, "relative timer test (at 500 ms) ...\n"); set_timespec(&tmr.it_value, 500 * 1000); set_timespec(&tmr.it_interval, 0); tnow = getustime(clks[i].id); if ((tfd = timerfd_create(clks[i].id, 0)) == -1) { perror("timerfd_create"); return 1; } if (timerfd_settime(tfd, 0, &tmr, NULL)) { perror("timerfd_settime"); return 1; } fprintf(stdout, "wating timer ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %.1f s\n", ticks, (ttmr - tnow) * 1e-6); fprintf(stdout, "absolute timer test (at 500 ms) ...\n"); tnow = getustime(clks[i].id); set_timespec(&tmr.it_value, tnow + 500 * 1000); set_timespec(&tmr.it_interval, 0); if (timerfd_settime(tfd, TFD_TIMER_ABSTIME, &tmr, NULL)) { perror("timerfd_settime"); return 1; } fprintf(stdout, "wating timer ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %.1f s\n", ticks, (ttmr - tnow) * 1e-6); fprintf(stdout, "sequential timer test (100 ms clock) ...\n"); tnow = getustime(clks[i].id); set_timespec(&tmr.it_value, tnow + 100 * 1000); set_timespec(&tmr.it_interval, 100 * 1000); if (timerfd_settime(tfd, TFD_TIMER_ABSTIME, &tmr, NULL)) { perror("timerfd_settime"); return 1; } fprintf(stdout, "sleeping one second ...\n"); sleep(1); if (timerfd_gettime(tfd, &tmr)) { perror("timerfd_gettime"); return 1; } fprintf(stdout, "timerfd_gettime returned:\n" "\tit_value = %.1f it_interval = %.1f\n", tmr.it_value.tv_sec + 1e-9 * tmr.it_value.tv_nsec, tmr.it_interval.tv_sec + 1e-9 * tmr.it_interval.tv_nsec); fprintf(stdout, "sleeping 1 second ...\n"); sleep(1); fprintf(stdout, "wating timer ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %.1f s\n", ticks, (ttmr - tnow) * 1e-6); fprintf(stdout, "O_NONBLOCK test ...\n"); tnow = getustime(clks[i].id); set_timespec(&tmr.it_value, 100 * 1000); set_timespec(&tmr.it_interval, 0); if (timerfd_settime(tfd, 0, &tmr, NULL)) { perror("timerfd_settime"); return 1; } #if 0 fprintf(stdout, "timerfd = %d\n", tfd); #endif fprintf(stdout, "wating timer (flush the single tick) ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %.1f s\n", ticks, (ttmr - tnow) * 1e-6); fcntl(tfd, F_SETFL, fcntl(tfd, F_GETFL, 0) | O_NONBLOCK); if (read(tfd, &uticks, sizeof(uticks)) > 0) fprintf(stdout, "whooops! timer ticks not zero when should have been\n"); else if (errno != EAGAIN) fprintf(stdout, "whooops! bad errno value (%d = '%s')!\n", errno, strerror(errno)); else fprintf(stdout, "success\n"); fcntl(tfd, F_SETFL, fcntl(tfd, F_GETFL, 0) & ~O_NONBLOCK); close(tfd); } return 0; }
int main(int ac, char **av) { int i, tfd; long ticks; unsigned long long tnow, ttmr; u_int64_t uticks; struct itimerspec tmr; struct tmr_type clks[] = { {CLOCK_MONOTONIC, "CLOCK MONOTONIC"}, {CLOCK_REALTIME, "CLOCK REALTIME"}, }; if ((tst_kvercmp(2, 6, 25)) < 0) { tst_resm(TCONF, "This test can only run on kernels that are "); tst_resm(TCONF, "2.6.25 and higher"); exit(0); } for (i = 0; i < sizeof(clks) / sizeof(clks[0]); i++) { fprintf(stdout, "\n\n---------------------------------------\n"); fprintf(stdout, "| testing %s\n", clks[i].name); fprintf(stdout, "---------------------------------------\n\n"); fprintf(stdout, "relative timer test (at 500 ms) ...\n"); set_timespec(&tmr.it_value, 500 * 1000); set_timespec(&tmr.it_interval, 0); tnow = getustime(clks[i].id); if ((tfd = timerfd_create(clks[i].id, 0)) == -1) { perror("timerfd"); return 1; } fprintf(stdout, "timerfd = %d\n", tfd); if (timerfd_settime(tfd, 0, &tmr, NULL)) { perror("timerfd_settime"); return 1; } fprintf(stdout, "wating timer ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %llu ms\n", ticks, (ttmr - tnow) / 1000); fprintf(stdout, "absolute timer test (at 500 ms) ...\n"); tnow = getustime(clks[i].id); set_timespec(&tmr.it_value, tnow + 500 * 1000); set_timespec(&tmr.it_interval, 0); if (timerfd_settime(tfd, TFD_TIMER_ABSTIME, &tmr, NULL)) { perror("timerfd_settime"); return 1; } fprintf(stdout, "wating timer ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %llu ms\n", ticks, (ttmr - tnow) / 1000); fprintf(stdout, "sequential timer test (100 ms clock) ...\n"); tnow = getustime(clks[i].id); set_timespec(&tmr.it_value, tnow + 100 * 1000); set_timespec(&tmr.it_interval, 100 * 1000); if (timerfd_settime(tfd, TFD_TIMER_ABSTIME, &tmr, NULL)) { perror("timerfd_settime"); return 1; } fprintf(stdout, "sleeping 1 second ...\n"); sleep(1); if (timerfd_gettime(tfd, &tmr)) { perror("timerfd_gettime"); return 1; } fprintf(stdout, "timerfd_gettime returned:\n" "\tit_value = { %ld, %ld } it_interval = { %ld, %ld }\n", (long)tmr.it_value.tv_sec, (long)tmr.it_value.tv_nsec, (long)tmr.it_interval.tv_sec, (long)tmr.it_interval.tv_nsec); fprintf(stdout, "sleeping 1 second ...\n"); sleep(1); fprintf(stdout, "wating timer ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %llu ms\n", ticks, (ttmr - tnow) / 1000); fprintf(stdout, "O_NONBLOCK test ...\n"); tnow = getustime(clks[i].id); set_timespec(&tmr.it_value, 100 * 1000); set_timespec(&tmr.it_interval, 0); if (timerfd_settime(tfd, 0, &tmr, NULL)) { perror("timerfd_settime"); return 1; } fprintf(stdout, "timerfd = %d\n", tfd); fprintf(stdout, "wating timer (flush the single tick) ...\n"); ticks = waittmr(tfd, -1); ttmr = getustime(clks[i].id); if (ticks <= 0) fprintf(stdout, "whooops! no timer showed up!\n"); else fprintf(stdout, "got timer ticks (%ld) after %llu ms\n", ticks, (ttmr - tnow) / 1000); fcntl(tfd, F_SETFL, fcntl(tfd, F_GETFL, 0) | O_NONBLOCK); if (read(tfd, &uticks, sizeof(uticks)) > 0) fprintf(stdout, "whooops! timer ticks not zero when should have been\n"); else if (errno != EAGAIN) fprintf(stdout, "whooops! bad errno value (%d = '%s')!\n", errno, strerror(errno)); else fprintf(stdout, "success\n"); fcntl(tfd, F_SETFL, fcntl(tfd, F_GETFL, 0) & ~O_NONBLOCK); close(tfd); } tst_exit(); }