• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <signal.h>
2 #include <stdio.h>
3 #include "posixtest.h"
4 
5 /*
6 
7  * Copyright (c) 2002, Intel Corporation. All rights reserved.
8  * Created by:  rolla.n.selbak REMOVE-THIS AT intel DOT com
9  * This file is licensed under the GPL license.  For the full content
10  * of this license, see the COPYING file at the top level of this
11  * source tree.
12 
13  *  Test that the sigwait() function.
14  *  If prior to the call to sigwait() there are multiple pending instances of
15  *  a single signal number (and it is implementation-defined that the signal
16  *  number supports queued signals), then there should be remaining
17  *  pending signals for that signal number.
18  *  Steps are:
19  *  1)  Block a signal that supports queueing (the realtime signal SIGRTMIN).
20  *  2)  Raise that signal 2 times.
21  *  3)  Call sigwait()
22  *  4)  Verify that is cleared only one instance of the signal in the pending
23  *      set.
24  *  5) Call sigwait() again to clear the second instance of the signal in the
25  *     pending list.
26  *  6) Verify that there are no more instances for SIGRTMIN in the pending list. *
27  */
28 
main(void)29 int main(void)
30 {
31 	sigset_t newmask, pendingset;
32 	int sig;
33 
34 	/* Empty set of blocked signals */
35 
36 	if ((sigemptyset(&newmask) == -1) || (sigemptyset(&pendingset) == -1)) {
37 		printf("Error in sigemptyset()\n");
38 		return PTS_UNRESOLVED;
39 	}
40 
41 	/* Add SIGRTMIN to the set of blocked signals */
42 	if (sigaddset(&newmask, SIGRTMIN) == -1) {
43 		perror("Error in sigaddset()\n");
44 		return PTS_UNRESOLVED;
45 	}
46 
47 	/* Obtain a set of pending signals and make sure SIGRTMIN
48 	 * isn't pending. */
49 	if (sigpending(&pendingset) == -1) {
50 		printf("Error calling sigpending()\n");
51 		return PTS_UNRESOLVED;
52 	}
53 
54 	if (sigismember(&pendingset, SIGRTMIN) == 1) {
55 		printf("Error: signal SIGRTMIN is pending\n");
56 		return PTS_UNRESOLVED;
57 	}
58 
59 	/* Block SIGALRM */
60 	if (sigprocmask(SIG_SETMASK, &newmask, NULL) == -1) {
61 		printf("Error in sigprocmask()\n");
62 		return PTS_UNRESOLVED;
63 	}
64 
65 	/* Send SIGALRM signal 2 times to this process.  Since it is blocked,
66 	 * it should be pending and queued. */
67 	if (raise(SIGRTMIN) != 0) {
68 		printf("Could not raise SIGALRM\n");
69 		return PTS_UNRESOLVED;
70 	}
71 
72 	if (raise(SIGRTMIN) != 0) {
73 		printf("Could not raise SIGALRM\n");
74 		return PTS_UNRESOLVED;
75 	}
76 
77 	/* Obtain a set of pending signals */
78 	if (sigpending(&pendingset) == -1) {
79 		printf("Error calling sigpending()\n");
80 		return PTS_UNRESOLVED;
81 	}
82 
83 	/* Make sure SIGRTMIN is still pending since sigwait should have only
84 	 * deleted one instance of SIGRTMIN from the pending set. */
85 	if (sigismember(&pendingset, SIGRTMIN) == 0) {
86 		printf("Test FAILED\n");
87 		return -1;
88 	}
89 
90 	/* Call sigwait to remove first SIGRTMIN instance from the
91 	 * pending list. */
92 	if (sigwait(&newmask, &sig) != 0) {
93 		printf("Error in sigwait\n");
94 		return PTS_FAIL;
95 	}
96 
97 	/* Make sure SIGRTMIN is still in the pending list */
98 	if (sigpending(&pendingset) == -1) {
99 		printf("Error calling sigpending()\n");
100 		return PTS_UNRESOLVED;
101 	}
102 
103 	if (sigismember(&pendingset, SIGRTMIN) == 0) {
104 		printf("Test FAILED\n");
105 		return PTS_FAIL;
106 	}
107 
108 	/* Call sigwait again to remove last SIGRTMIN instance from the
109 	 * pending list. */
110 	if (sigwait(&newmask, &sig) != 0) {
111 		printf("Error in sigwait\n");
112 		return PTS_FAIL;
113 	}
114 
115 	/* Make sure SIGRTMIN is NOT in the pending list anymore, since
116 	 * the previous sigwait() should have taken it out of the
117 	 * pending list. */
118 	if (sigpending(&pendingset) == -1) {
119 		printf("Error calling sigpending()\n");
120 		return PTS_UNRESOLVED;
121 	}
122 
123 	if (sigismember(&pendingset, SIGRTMIN) != 0) {
124 		printf("Test FAILED\n");
125 		return PTS_FAIL;
126 	}
127 
128 	printf("Test PASSED\n");
129 	return PTS_PASS;
130 
131 }
132