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 __thread kqfd;
22 test_kevent_signal_add(void)
26 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
30 test_kevent_signal_get(void)
34 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
36 if (kill(getpid(), SIGUSR1) < 0)
39 kev.flags |= EV_CLEAR;
41 kevent_cmp(&kev, kevent_get(kqfd));
45 test_kevent_signal_disable(void)
49 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_DISABLE, 0, 0, NULL);
51 if (kill(getpid(), SIGUSR1) < 0)
54 test_no_kevents(kqfd);
58 test_kevent_signal_enable(void)
62 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ENABLE, 0, 0, NULL);
64 if (kill(getpid(), SIGUSR1) < 0)
67 kev.flags = EV_ADD | EV_CLEAR;
69 kev.data = 1; /* WORKAROUND */
71 kev.data = 2; // one extra time from test_kevent_signal_disable()
73 kevent_cmp(&kev, kevent_get(kqfd));
75 /* Delete the watch */
76 kev.flags = EV_DELETE;
77 if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
82 test_kevent_signal_del(void)
86 /* Delete the kevent */
87 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_DELETE, 0, 0, NULL);
89 signal(SIGUSR1, SIG_IGN);
90 if (kill(getpid(), SIGUSR1) < 0)
93 test_no_kevents(kqfd);
97 test_kevent_signal_oneshot(void)
101 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD | EV_ONESHOT, 0, 0, NULL);
103 if (kill(getpid(), SIGUSR1) < 0)
106 kev.flags |= EV_CLEAR;
108 kevent_cmp(&kev, kevent_get(kqfd));
110 /* Send another one and make sure we get no events */
111 test_no_kevents(kqfd);
112 if (kill(getpid(), SIGUSR1) < 0)
114 test_no_kevents(kqfd);
118 test_kevent_signal_modify(void)
122 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
123 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, ((void *)-1));
125 if (kill(getpid(), SIGUSR1) < 0)
128 kev.flags |= EV_CLEAR;
130 kevent_cmp(&kev, kevent_get(kqfd));
135 test_kevent_signal_dispatch(void)
139 test_no_kevents(kqfd);
141 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD | EV_CLEAR | EV_DISPATCH, 0, 0, NULL);
144 if (kill(getpid(), SIGUSR1) < 0)
147 kevent_cmp(&kev, kevent_get(kqfd));
149 /* Confirm that the knote is disabled */
150 if (kill(getpid(), SIGUSR1) < 0)
152 test_no_kevents(kqfd);
154 /* Enable the knote and make sure no events are pending */
155 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_ENABLE | EV_DISPATCH, 0, 0, NULL);
156 test_no_kevents(kqfd);
158 /* Get the next event */
159 if (kill(getpid(), SIGUSR1) < 0)
161 kev.flags = EV_ADD | EV_CLEAR | EV_DISPATCH;
163 kevent_cmp(&kev, kevent_get(kqfd));
165 /* Remove the knote and ensure the event no longer fires */
166 kevent_add(kqfd, &kev, SIGUSR1, EVFILT_SIGNAL, EV_DELETE, 0, 0, NULL);
167 if (kill(getpid(), SIGUSR1) < 0)
169 test_no_kevents(kqfd);
171 #endif /* HAVE_EV_DISPATCH */
174 test_evfilt_signal(int _kqfd)
176 signal(SIGUSR1, SIG_IGN);
179 test(kevent_signal_add);
180 test(kevent_signal_del);
181 test(kevent_signal_get);
182 test(kevent_signal_disable);
183 test(kevent_signal_enable);
184 test(kevent_signal_oneshot);
185 test(kevent_signal_modify);
187 test(kevent_signal_dispatch);