xref: /freebsd-src/tests/sys/kqueue/libkqueue/user.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1cb5fe245SEnji Cooper /*
2cb5fe245SEnji Cooper  * Copyright (c) 2009 Mark Heily <mark@heily.com>
3cb5fe245SEnji Cooper  *
4cb5fe245SEnji Cooper  * Permission to use, copy, modify, and distribute this software for any
5cb5fe245SEnji Cooper  * purpose with or without fee is hereby granted, provided that the above
6cb5fe245SEnji Cooper  * copyright notice and this permission notice appear in all copies.
7cb5fe245SEnji Cooper  *
8cb5fe245SEnji Cooper  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9cb5fe245SEnji Cooper  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10cb5fe245SEnji Cooper  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11cb5fe245SEnji Cooper  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12cb5fe245SEnji Cooper  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13cb5fe245SEnji Cooper  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14cb5fe245SEnji Cooper  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15cb5fe245SEnji Cooper  */
16cb5fe245SEnji Cooper 
17cb5fe245SEnji Cooper #include "common.h"
18cb5fe245SEnji Cooper 
19cb5fe245SEnji Cooper 
20cb5fe245SEnji Cooper static void
add_and_delete(void)21cb5fe245SEnji Cooper add_and_delete(void)
22cb5fe245SEnji Cooper {
23cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_ADD and EV_DELETE)";
24cb5fe245SEnji Cooper     struct kevent kev;
25cb5fe245SEnji Cooper 
26cb5fe245SEnji Cooper     test_begin(test_id);
27cb5fe245SEnji Cooper 
28cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
29cb5fe245SEnji Cooper     test_no_kevents();
30cb5fe245SEnji Cooper 
31cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);
32cb5fe245SEnji Cooper     test_no_kevents();
33cb5fe245SEnji Cooper 
34cb5fe245SEnji Cooper     success();
35cb5fe245SEnji Cooper }
36cb5fe245SEnji Cooper 
37cb5fe245SEnji Cooper static void
event_wait(void)38cb5fe245SEnji Cooper event_wait(void)
39cb5fe245SEnji Cooper {
40cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, wait)";
41cb5fe245SEnji Cooper     struct kevent kev;
42cb5fe245SEnji Cooper 
43cb5fe245SEnji Cooper     test_begin(test_id);
44cb5fe245SEnji Cooper 
45cb5fe245SEnji Cooper     test_no_kevents();
46cb5fe245SEnji Cooper 
47cb5fe245SEnji Cooper     /* Add the event, and then trigger it */
48cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL);
49cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
50cb5fe245SEnji Cooper 
51cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
52cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
53cb5fe245SEnji Cooper     kev.flags = EV_CLEAR;
54cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
55cb5fe245SEnji Cooper 
56cb5fe245SEnji Cooper     test_no_kevents();
57cb5fe245SEnji Cooper 
58cb5fe245SEnji Cooper     success();
59cb5fe245SEnji Cooper }
60cb5fe245SEnji Cooper 
61cb5fe245SEnji Cooper static void
event_wait_keepudata(void)62*0321a799SNathaniel Wesley Filardo event_wait_keepudata(void)
63*0321a799SNathaniel Wesley Filardo {
64*0321a799SNathaniel Wesley Filardo     const char *test_id = "kevent(EVFILT_USER, wait w/ EV_KEEPUDATA)";
65*0321a799SNathaniel Wesley Filardo     struct kevent kev;
66*0321a799SNathaniel Wesley Filardo 
67*0321a799SNathaniel Wesley Filardo     test_begin(test_id);
68*0321a799SNathaniel Wesley Filardo 
69*0321a799SNathaniel Wesley Filardo     test_no_kevents();
70*0321a799SNathaniel Wesley Filardo 
71*0321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, &kev);
72*0321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0,
73*0321a799SNathaniel Wesley Filardo         NULL);
74*0321a799SNathaniel Wesley Filardo 
75*0321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_FFCTRLMASK;
76*0321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_TRIGGER;
77*0321a799SNathaniel Wesley Filardo     kev.flags = EV_CLEAR;
78*0321a799SNathaniel Wesley Filardo     kev.udata = &kev;
79*0321a799SNathaniel Wesley Filardo     kevent_cmp(&kev, kevent_get(kqfd));
80*0321a799SNathaniel Wesley Filardo 
81*0321a799SNathaniel Wesley Filardo     test_no_kevents();
82*0321a799SNathaniel Wesley Filardo 
83*0321a799SNathaniel Wesley Filardo     success();
84*0321a799SNathaniel Wesley Filardo }
85*0321a799SNathaniel Wesley Filardo 
86*0321a799SNathaniel Wesley Filardo 
87*0321a799SNathaniel Wesley Filardo static void
disable_and_enable(void)88cb5fe245SEnji Cooper disable_and_enable(void)
89cb5fe245SEnji Cooper {
90cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE)";
91cb5fe245SEnji Cooper     struct kevent kev;
92cb5fe245SEnji Cooper 
93cb5fe245SEnji Cooper     test_begin(test_id);
94cb5fe245SEnji Cooper 
95cb5fe245SEnji Cooper     test_no_kevents();
96cb5fe245SEnji Cooper 
97cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
98cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL);
99cb5fe245SEnji Cooper 
100cb5fe245SEnji Cooper     /* Trigger the event, but since it is disabled, nothing will happen. */
101cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
102cb5fe245SEnji Cooper     test_no_kevents();
103cb5fe245SEnji Cooper 
104cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL);
105cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
106cb5fe245SEnji Cooper 
107cb5fe245SEnji Cooper     kev.flags = EV_CLEAR;
108cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
109cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
110cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
111cb5fe245SEnji Cooper 
112cb5fe245SEnji Cooper     success();
113cb5fe245SEnji Cooper }
114cb5fe245SEnji Cooper 
115cb5fe245SEnji Cooper static void
disable_and_enable_keepudata(void)116*0321a799SNathaniel Wesley Filardo disable_and_enable_keepudata(void)
117*0321a799SNathaniel Wesley Filardo {
118*0321a799SNathaniel Wesley Filardo     const char *test_id =
119*0321a799SNathaniel Wesley Filardo         "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE w/ EV_KEEPUDATA)";
120*0321a799SNathaniel Wesley Filardo     struct kevent kev;
121*0321a799SNathaniel Wesley Filardo 
122*0321a799SNathaniel Wesley Filardo     test_begin(test_id);
123*0321a799SNathaniel Wesley Filardo 
124*0321a799SNathaniel Wesley Filardo     test_no_kevents();
125*0321a799SNathaniel Wesley Filardo 
126*0321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, &kev);
127*0321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE | EV_KEEPUDATA, 0, 0,
128*0321a799SNathaniel Wesley Filardo         NULL);
129*0321a799SNathaniel Wesley Filardo 
130*0321a799SNathaniel Wesley Filardo     /* Trigger the event, but since it is disabled, nothing will happen. */
131*0321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0, NULL);
132*0321a799SNathaniel Wesley Filardo     test_no_kevents();
133*0321a799SNathaniel Wesley Filardo 
134*0321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE | EV_KEEPUDATA, 0, 0,
135*0321a799SNathaniel Wesley Filardo         NULL);
136*0321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0, NULL);
137*0321a799SNathaniel Wesley Filardo 
138*0321a799SNathaniel Wesley Filardo     kev.flags = EV_CLEAR;
139*0321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_FFCTRLMASK;
140*0321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_TRIGGER;
141*0321a799SNathaniel Wesley Filardo     kev.udata = &kev;
142*0321a799SNathaniel Wesley Filardo     kevent_cmp(&kev, kevent_get(kqfd));
143*0321a799SNathaniel Wesley Filardo 
144*0321a799SNathaniel Wesley Filardo     success();
145*0321a799SNathaniel Wesley Filardo }
146*0321a799SNathaniel Wesley Filardo 
147*0321a799SNathaniel Wesley Filardo static void
oneshot(void)148cb5fe245SEnji Cooper oneshot(void)
149cb5fe245SEnji Cooper {
150cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_ONESHOT)";
151cb5fe245SEnji Cooper     struct kevent kev;
152cb5fe245SEnji Cooper 
153cb5fe245SEnji Cooper     test_begin(test_id);
154cb5fe245SEnji Cooper 
155cb5fe245SEnji Cooper     test_no_kevents();
156cb5fe245SEnji Cooper 
157cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL);
158cb5fe245SEnji Cooper 
159cb5fe245SEnji Cooper     puts("  -- event 1");
160cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
161cb5fe245SEnji Cooper 
162cb5fe245SEnji Cooper     kev.flags = EV_ONESHOT;
163cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
164cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
165cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
166cb5fe245SEnji Cooper 
167cb5fe245SEnji Cooper     test_no_kevents();
168cb5fe245SEnji Cooper 
169cb5fe245SEnji Cooper     success();
170cb5fe245SEnji Cooper }
171cb5fe245SEnji Cooper 
172cb5fe245SEnji Cooper void
test_evfilt_user(void)173c9c283bdSAlex Richardson test_evfilt_user(void)
174cb5fe245SEnji Cooper {
175cb5fe245SEnji Cooper     kqfd = kqueue();
176cb5fe245SEnji Cooper 
177cb5fe245SEnji Cooper     add_and_delete();
178cb5fe245SEnji Cooper     event_wait();
179*0321a799SNathaniel Wesley Filardo     event_wait_keepudata();
180cb5fe245SEnji Cooper     disable_and_enable();
181*0321a799SNathaniel Wesley Filardo     disable_and_enable_keepudata();
182cb5fe245SEnji Cooper     oneshot();
183cb5fe245SEnji Cooper     /* TODO: try different fflags operations */
184cb5fe245SEnji Cooper 
185cb5fe245SEnji Cooper     close(kqfd);
186cb5fe245SEnji Cooper }
187