xref: /freebsd/tests/sys/kqueue/libkqueue/user.c (revision b3e76948)
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)620321a799SNathaniel Wesley Filardo event_wait_keepudata(void)
630321a799SNathaniel Wesley Filardo {
640321a799SNathaniel Wesley Filardo     const char *test_id = "kevent(EVFILT_USER, wait w/ EV_KEEPUDATA)";
650321a799SNathaniel Wesley Filardo     struct kevent kev;
660321a799SNathaniel Wesley Filardo 
670321a799SNathaniel Wesley Filardo     test_begin(test_id);
680321a799SNathaniel Wesley Filardo 
690321a799SNathaniel Wesley Filardo     test_no_kevents();
700321a799SNathaniel Wesley Filardo 
710321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, &kev);
720321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0,
730321a799SNathaniel Wesley Filardo         NULL);
740321a799SNathaniel Wesley Filardo 
750321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_FFCTRLMASK;
760321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_TRIGGER;
770321a799SNathaniel Wesley Filardo     kev.flags = EV_CLEAR;
780321a799SNathaniel Wesley Filardo     kev.udata = &kev;
790321a799SNathaniel Wesley Filardo     kevent_cmp(&kev, kevent_get(kqfd));
800321a799SNathaniel Wesley Filardo 
810321a799SNathaniel Wesley Filardo     test_no_kevents();
820321a799SNathaniel Wesley Filardo 
830321a799SNathaniel Wesley Filardo     success();
840321a799SNathaniel Wesley Filardo }
850321a799SNathaniel Wesley Filardo 
860321a799SNathaniel Wesley Filardo 
870321a799SNathaniel 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)1160321a799SNathaniel Wesley Filardo disable_and_enable_keepudata(void)
1170321a799SNathaniel Wesley Filardo {
1180321a799SNathaniel Wesley Filardo     const char *test_id =
1190321a799SNathaniel Wesley Filardo         "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE w/ EV_KEEPUDATA)";
1200321a799SNathaniel Wesley Filardo     struct kevent kev;
1210321a799SNathaniel Wesley Filardo 
1220321a799SNathaniel Wesley Filardo     test_begin(test_id);
1230321a799SNathaniel Wesley Filardo 
1240321a799SNathaniel Wesley Filardo     test_no_kevents();
1250321a799SNathaniel Wesley Filardo 
1260321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, &kev);
1270321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE | EV_KEEPUDATA, 0, 0,
1280321a799SNathaniel Wesley Filardo         NULL);
1290321a799SNathaniel Wesley Filardo 
1300321a799SNathaniel Wesley Filardo     /* Trigger the event, but since it is disabled, nothing will happen. */
1310321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0, NULL);
1320321a799SNathaniel Wesley Filardo     test_no_kevents();
1330321a799SNathaniel Wesley Filardo 
1340321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE | EV_KEEPUDATA, 0, 0,
1350321a799SNathaniel Wesley Filardo         NULL);
1360321a799SNathaniel Wesley Filardo     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0, NULL);
1370321a799SNathaniel Wesley Filardo 
1380321a799SNathaniel Wesley Filardo     kev.flags = EV_CLEAR;
1390321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_FFCTRLMASK;
1400321a799SNathaniel Wesley Filardo     kev.fflags &= ~NOTE_TRIGGER;
1410321a799SNathaniel Wesley Filardo     kev.udata = &kev;
1420321a799SNathaniel Wesley Filardo     kevent_cmp(&kev, kevent_get(kqfd));
1430321a799SNathaniel Wesley Filardo 
1440321a799SNathaniel Wesley Filardo     success();
1450321a799SNathaniel Wesley Filardo }
1460321a799SNathaniel Wesley Filardo 
1470321a799SNathaniel 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();
1790321a799SNathaniel Wesley Filardo     event_wait_keepudata();
180cb5fe245SEnji Cooper     disable_and_enable();
1810321a799SNathaniel 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