1 /*
2 * Copyright (c) 2002-2003, Intel Corporation. All rights reserved.
3 * Created by: salwan.searty REMOVE-THIS AT intel DOT com
4 * This file is licensed under the GPL license. For the full content
5 * of this license, see the COPYING file at the top level of this
6 * source tree.
7
8 * Test that if the signal specified by set does not become pending,
9 and the timespec structure pointed to by timeout is zero-valued,
10 the sigtimedwait() function shall return immediately with an error.
11
12 NOTE: This program has commented out areas. The commented out functionality
13 sets a timer in case sigtimedwait() never returns, to help the program
14 from hanging. To make this program
15 runnable on a typical system, I've commented out the timer functionality
16 by default. However, if you do have a timers implementation on your
17 system, then it is recommened that you uncomment the timers-related lines
18 of code in this program.
19
20 Steps:
21 1. Register signal TIMERSIGNAL with the handler myhandler
22 (2.)Create and set a timer that expires in TIMERSEC seconds incase sigtimedwait()
23 never returns.
24 3. Obtain time1.
25 4. Call sigtimedwait() to wait for non-pending signal SIGTOTEST for SIGTIMEDWAITSEC
26 seconds.
27 5. Obtain time2, and find the difference between time2 and time1.
28 6. Verify that (time2-time1) is equal to SIGTIMEDWAITSEC within a reasonable
29 error margin.
30 */
31
32 #define _XOPEN_REALTIME 1
33
34 #define TIMERSIGNAL SIGUSR1
35 #define SIGTOTEST SIGUSR2
36 #define TIMERSEC 2
37 #define SIGTIMEDWAITSEC 0
38 #define ERRORMARGIN 0.1
39
40 #include <signal.h>
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include <time.h>
44 #include <unistd.h>
45 #include <sys/time.h>
46 #include <sys/wait.h>
47 #include "posixtest.h"
48
myhandler(int signo)49 void myhandler(int signo)
50 {
51 printf
52 ("Test FAILED: %d seconds have elapsed and sigtimedwait() has not yet returned.\n",
53 TIMERSEC);
54 exit(PTS_FAIL);
55 }
56
main(void)57 int main(void)
58 {
59 struct sigaction act;
60
61 struct timeval time1, time2;
62 double time_elapsed;
63
64 sigset_t selectset;
65 struct timespec ts;
66 /*
67 struct sigevent ev;
68 timer_t tid;
69 struct itimerspec its;
70
71 its.it_interval.tv_sec = 0;
72 its.it_interval.tv_nsec = 0;
73 its.it_value.tv_sec = TIMERSEC;
74 its.it_value.tv_nsec = 0;
75
76 ev.sigev_notify = SIGEV_SIGNAL;
77 ev.sigev_signo = TIMERSIGNAL;
78 */
79 act.sa_flags = 0;
80 act.sa_handler = myhandler;
81 sigemptyset(&act.sa_mask);
82 sigaction(TIMERSIGNAL, &act, 0);
83
84 sigemptyset(&selectset);
85 sigaddset(&selectset, SIGTOTEST);
86
87 ts.tv_sec = SIGTIMEDWAITSEC;
88 ts.tv_nsec = 0;
89 /*
90 if (timer_create(CLOCK_REALTIME, &ev, &tid) != 0) {
91 perror("timer_create() did not return success\n");
92 return PTS_UNRESOLVED;
93 }
94
95 if (timer_settime(tid, 0, &its, NULL) != 0) {
96 perror("timer_settime() did not return success\n");
97 return PTS_UNRESOLVED;
98 }
99 */
100 if (gettimeofday(&time1, NULL) == -1) {
101 perror("gettimeofday()");
102 return PTS_UNRESOLVED;
103 }
104 if (sigtimedwait(&selectset, NULL, &ts) != -1) {
105 printf
106 ("Test FAILED: sigtimedwait() did not return with an error\n");
107 return PTS_FAIL;
108 }
109 if (gettimeofday(&time2, NULL) == -1) {
110 perror("gettimeofday()");
111 return PTS_UNRESOLVED;
112 }
113
114 time_elapsed = (time2.tv_sec - time1.tv_sec
115 + (time2.tv_usec - time1.tv_usec) / 1000000.0);
116
117 if ((time_elapsed > SIGTIMEDWAITSEC + ERRORMARGIN)
118 || (time_elapsed < SIGTIMEDWAITSEC - ERRORMARGIN)) {
119 printf
120 ("Test FAILED: sigtimedwait() did not return immediately\n");
121 return PTS_FAIL;
122 }
123
124 printf("Test PASSED\n");
125 return PTS_PASS;
126 }
127