2 * Copyright (c) 2009 Mark Heily <mark@heily.com>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 static int sigusr1_caught = 0;
21 static int __thread kqfd;
24 sig_handler(int signum)
30 test_kevent_proc_add(void)
34 test_no_kevents(kqfd);
35 kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_ADD, 0, 0, NULL);
36 test_no_kevents(kqfd);
40 test_kevent_proc_delete(void)
44 test_no_kevents(kqfd);
45 kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_DELETE, 0, 0, NULL);
46 if (kill(pid, SIGKILL) < 0)
49 test_no_kevents(kqfd);
53 test_kevent_proc_get(void)
57 /* Create a child that waits to be killed and then exits */
61 printf(" -- child caught signal, exiting\n");
64 printf(" -- child created (pid %d)\n", (int) pid);
66 test_no_kevents(kqfd);
67 kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_ADD, 0, 0, NULL);
69 /* Cause the child to exit, then retrieve the event */
70 printf(" -- killing process %d\n", (int) pid);
71 if (kill(pid, SIGUSR1) < 0)
73 kevent_cmp(&kev, kevent_get(kqfd));
74 test_no_kevents(kqfd);
79 test_kevent_signal_disable(void)
81 const char *test_id = "kevent(EVFILT_SIGNAL, EV_DISABLE)";
86 EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DISABLE, 0, 0, NULL);
87 if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
90 /* Block SIGUSR1, then send it to ourselves */
93 sigaddset(&mask, SIGUSR1);
94 if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
96 if (kill(getpid(), SIGKILL) < 0)
105 test_kevent_signal_enable(void)
107 const char *test_id = "kevent(EVFILT_SIGNAL, EV_ENABLE)";
112 EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ENABLE, 0, 0, NULL);
113 if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
116 /* Block SIGUSR1, then send it to ourselves */
119 sigaddset(&mask, SIGUSR1);
120 if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
122 if (kill(getpid(), SIGUSR1) < 0)
125 kev.flags = EV_ADD | EV_CLEAR;
127 kev.data = 1; /* WORKAROUND */
129 kev.data = 2; // one extra time from test_kevent_signal_disable()
131 kevent_cmp(&kev, kevent_get(kqfd));
133 /* Delete the watch */
134 kev.flags = EV_DELETE;
135 if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
142 test_kevent_signal_del(void)
144 const char *test_id = "kevent(EVFILT_SIGNAL, EV_DELETE)";
149 /* Delete the kevent */
150 EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DELETE, 0, 0, NULL);
151 if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
154 /* Block SIGUSR1, then send it to ourselves */
157 sigaddset(&mask, SIGUSR1);
158 if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
160 if (kill(getpid(), SIGUSR1) < 0)
168 test_kevent_signal_oneshot(void)
170 const char *test_id = "kevent(EVFILT_SIGNAL, EV_ONESHOT)";
175 EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD | EV_ONESHOT, 0, 0, NULL);
176 if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
179 /* Block SIGUSR1, then send it to ourselves */
182 sigaddset(&mask, SIGUSR1);
183 if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
185 if (kill(getpid(), SIGUSR1) < 0)
188 kev.flags |= EV_CLEAR;
190 kevent_cmp(&kev, kevent_get(kqfd));
192 /* Send another one and make sure we get no events */
193 if (kill(getpid(), SIGUSR1) < 0)
202 test_evfilt_proc(int _kqfd)
206 signal(SIGUSR1, sig_handler);
208 /* Create a child that waits to be killed and then exits */
214 printf(" -- child created (pid %d)\n", (int) pid);
216 test(kevent_proc_add);
217 test(kevent_proc_delete);
218 test(kevent_proc_get);
220 signal(SIGUSR1, SIG_DFL);
223 test_kevent_signal_add();
224 test_kevent_signal_del();
225 test_kevent_signal_get();
226 test_kevent_signal_disable();
227 test_kevent_signal_enable();
228 test_kevent_signal_oneshot();