7-1.c revision 0dc076565f772bb1953209fb69ea150b494aaa40
10dc076565f772bb1953209fb69ea150b494aaa40robbiew/* 20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2002, Intel Corporation. All rights reserved. 30dc076565f772bb1953209fb69ea150b494aaa40robbiew * Created by: julie.n.fleischer REMOVE-THIS AT intel DOT com 40dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license. For the full content 50dc076565f772bb1953209fb69ea150b494aaa40robbiew * of this license, see the COPYING file at the top level of this 60dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree. 70dc076565f772bb1953209fb69ea150b494aaa40robbiew 80dc076565f772bb1953209fb69ea150b494aaa40robbiew * pt:MON 90dc076565f772bb1953209fb69ea150b494aaa40robbiew * 100dc076565f772bb1953209fb69ea150b494aaa40robbiew * Test that CLOCK_MONOTONIC is supported by timer_create(). 110dc076565f772bb1953209fb69ea150b494aaa40robbiew * 120dc076565f772bb1953209fb69ea150b494aaa40robbiew * Same test as 1-1.c with CLOCK_MONOTONIC. 130dc076565f772bb1953209fb69ea150b494aaa40robbiew */ 140dc076565f772bb1953209fb69ea150b494aaa40robbiew 150dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <time.h> 160dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <signal.h> 170dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h> 180dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h> 190dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h> 200dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h" 210dc076565f772bb1953209fb69ea150b494aaa40robbiew 220dc076565f772bb1953209fb69ea150b494aaa40robbiew#define SIGTOTEST SIGALRM 230dc076565f772bb1953209fb69ea150b494aaa40robbiew#define TIMERSEC 2 240dc076565f772bb1953209fb69ea150b494aaa40robbiew#define SLEEPDELTA 3 250dc076565f772bb1953209fb69ea150b494aaa40robbiew#define ACCEPTABLEDELTA 1 260dc076565f772bb1953209fb69ea150b494aaa40robbiew 270dc076565f772bb1953209fb69ea150b494aaa40robbiewvoid handler(int signo) 280dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 290dc076565f772bb1953209fb69ea150b494aaa40robbiew printf("Caught signal\n"); 300dc076565f772bb1953209fb69ea150b494aaa40robbiew} 310dc076565f772bb1953209fb69ea150b494aaa40robbiew 320dc076565f772bb1953209fb69ea150b494aaa40robbiewint main(int argc, char *argv[]) 330dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 340dc076565f772bb1953209fb69ea150b494aaa40robbiew#ifdef CLOCK_MONOTONIC 350dc076565f772bb1953209fb69ea150b494aaa40robbiew if(sysconf(_SC_MONOTONIC_CLOCK) == -1) 360dc076565f772bb1953209fb69ea150b494aaa40robbiew { 370dc076565f772bb1953209fb69ea150b494aaa40robbiew printf("CLOCK_MONOTONIC unsupported\n"); 380dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNSUPPORTED; 390dc076565f772bb1953209fb69ea150b494aaa40robbiew } 400dc076565f772bb1953209fb69ea150b494aaa40robbiew struct sigevent ev; 410dc076565f772bb1953209fb69ea150b494aaa40robbiew struct sigaction act; 420dc076565f772bb1953209fb69ea150b494aaa40robbiew timer_t tid; 430dc076565f772bb1953209fb69ea150b494aaa40robbiew struct itimerspec its; 440dc076565f772bb1953209fb69ea150b494aaa40robbiew struct timespec ts, tsleft; 450dc076565f772bb1953209fb69ea150b494aaa40robbiew 460dc076565f772bb1953209fb69ea150b494aaa40robbiew ev.sigev_notify = SIGEV_SIGNAL; 470dc076565f772bb1953209fb69ea150b494aaa40robbiew ev.sigev_signo = SIGTOTEST; 480dc076565f772bb1953209fb69ea150b494aaa40robbiew 490dc076565f772bb1953209fb69ea150b494aaa40robbiew act.sa_handler=handler; 500dc076565f772bb1953209fb69ea150b494aaa40robbiew act.sa_flags=0; 510dc076565f772bb1953209fb69ea150b494aaa40robbiew 520dc076565f772bb1953209fb69ea150b494aaa40robbiew its.it_interval.tv_sec = 0; 530dc076565f772bb1953209fb69ea150b494aaa40robbiew its.it_interval.tv_nsec = 0; 540dc076565f772bb1953209fb69ea150b494aaa40robbiew its.it_value.tv_sec = TIMERSEC; 550dc076565f772bb1953209fb69ea150b494aaa40robbiew its.it_value.tv_nsec = 0; 560dc076565f772bb1953209fb69ea150b494aaa40robbiew 570dc076565f772bb1953209fb69ea150b494aaa40robbiew ts.tv_sec=TIMERSEC+SLEEPDELTA; 580dc076565f772bb1953209fb69ea150b494aaa40robbiew ts.tv_nsec=0; 590dc076565f772bb1953209fb69ea150b494aaa40robbiew 600dc076565f772bb1953209fb69ea150b494aaa40robbiew if (sigemptyset(&act.sa_mask) == -1) { 610dc076565f772bb1953209fb69ea150b494aaa40robbiew perror("Error calling sigemptyset\n"); 620dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNRESOLVED; 630dc076565f772bb1953209fb69ea150b494aaa40robbiew } 640dc076565f772bb1953209fb69ea150b494aaa40robbiew if (sigaction(SIGTOTEST, &act, 0) == -1) { 650dc076565f772bb1953209fb69ea150b494aaa40robbiew perror("Error calling sigaction\n"); 660dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNRESOLVED; 670dc076565f772bb1953209fb69ea150b494aaa40robbiew } 680dc076565f772bb1953209fb69ea150b494aaa40robbiew 690dc076565f772bb1953209fb69ea150b494aaa40robbiew if (timer_create(CLOCK_MONOTONIC, &ev, &tid) != 0) { 700dc076565f772bb1953209fb69ea150b494aaa40robbiew perror("timer_create() did not return success\n"); 710dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNRESOLVED; 720dc076565f772bb1953209fb69ea150b494aaa40robbiew } 730dc076565f772bb1953209fb69ea150b494aaa40robbiew 740dc076565f772bb1953209fb69ea150b494aaa40robbiew if (timer_settime(tid, 0, &its, NULL) != 0) { 750dc076565f772bb1953209fb69ea150b494aaa40robbiew perror("timer_settime() did not return success\n"); 760dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNRESOLVED; 770dc076565f772bb1953209fb69ea150b494aaa40robbiew } 780dc076565f772bb1953209fb69ea150b494aaa40robbiew 790dc076565f772bb1953209fb69ea150b494aaa40robbiew if (nanosleep(&ts, &tsleft) != -1) { 800dc076565f772bb1953209fb69ea150b494aaa40robbiew perror("nanosleep() not interrupted\n"); 810dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_FAIL; 820dc076565f772bb1953209fb69ea150b494aaa40robbiew } 830dc076565f772bb1953209fb69ea150b494aaa40robbiew 840dc076565f772bb1953209fb69ea150b494aaa40robbiew if ( abs(tsleft.tv_sec-SLEEPDELTA) <= ACCEPTABLEDELTA) { 850dc076565f772bb1953209fb69ea150b494aaa40robbiew printf("Test PASSED\n"); 860dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_PASS; 870dc076565f772bb1953209fb69ea150b494aaa40robbiew } else { 880dc076565f772bb1953209fb69ea150b494aaa40robbiew printf("Timer did not last for correct amount of time\n"); 890dc076565f772bb1953209fb69ea150b494aaa40robbiew printf("timer: %d != correct %d\n", 900dc076565f772bb1953209fb69ea150b494aaa40robbiew (int) ts.tv_sec- (int) tsleft.tv_sec, 910dc076565f772bb1953209fb69ea150b494aaa40robbiew TIMERSEC); 920dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_FAIL; 930dc076565f772bb1953209fb69ea150b494aaa40robbiew } 940dc076565f772bb1953209fb69ea150b494aaa40robbiew 950dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNRESOLVED; 960dc076565f772bb1953209fb69ea150b494aaa40robbiew#else 970dc076565f772bb1953209fb69ea150b494aaa40robbiew printf("CLOCK_MONOTONIC unsupported\n"); 980dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNSUPPORTED; 990dc076565f772bb1953209fb69ea150b494aaa40robbiew#endif 1000dc076565f772bb1953209fb69ea150b494aaa40robbiew 1010dc076565f772bb1953209fb69ea150b494aaa40robbiew} 102