xref: /freebsd-12.1/tests/sys/kqueue/libkqueue/user.c (revision 90e4ba11)
1*cb5fe245SEnji Cooper /*
2*cb5fe245SEnji Cooper  * Copyright (c) 2009 Mark Heily <[email protected]>
3*cb5fe245SEnji Cooper  *
4*cb5fe245SEnji Cooper  * Permission to use, copy, modify, and distribute this software for any
5*cb5fe245SEnji Cooper  * purpose with or without fee is hereby granted, provided that the above
6*cb5fe245SEnji Cooper  * copyright notice and this permission notice appear in all copies.
7*cb5fe245SEnji Cooper  *
8*cb5fe245SEnji Cooper  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*cb5fe245SEnji Cooper  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*cb5fe245SEnji Cooper  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*cb5fe245SEnji Cooper  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*cb5fe245SEnji Cooper  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*cb5fe245SEnji Cooper  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*cb5fe245SEnji Cooper  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*cb5fe245SEnji Cooper  *
16*cb5fe245SEnji Cooper  * $FreeBSD$
17*cb5fe245SEnji Cooper  */
18*cb5fe245SEnji Cooper 
19*cb5fe245SEnji Cooper #include "common.h"
20*cb5fe245SEnji Cooper 
21*cb5fe245SEnji Cooper int kqfd;
22*cb5fe245SEnji Cooper 
23*cb5fe245SEnji Cooper static void
add_and_delete(void)24*cb5fe245SEnji Cooper add_and_delete(void)
25*cb5fe245SEnji Cooper {
26*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_ADD and EV_DELETE)";
27*cb5fe245SEnji Cooper     struct kevent kev;
28*cb5fe245SEnji Cooper 
29*cb5fe245SEnji Cooper     test_begin(test_id);
30*cb5fe245SEnji Cooper 
31*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
32*cb5fe245SEnji Cooper     test_no_kevents();
33*cb5fe245SEnji Cooper 
34*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);
35*cb5fe245SEnji Cooper     test_no_kevents();
36*cb5fe245SEnji Cooper 
37*cb5fe245SEnji Cooper     success();
38*cb5fe245SEnji Cooper }
39*cb5fe245SEnji Cooper 
40*cb5fe245SEnji Cooper static void
event_wait(void)41*cb5fe245SEnji Cooper event_wait(void)
42*cb5fe245SEnji Cooper {
43*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, wait)";
44*cb5fe245SEnji Cooper     struct kevent kev;
45*cb5fe245SEnji Cooper 
46*cb5fe245SEnji Cooper     test_begin(test_id);
47*cb5fe245SEnji Cooper 
48*cb5fe245SEnji Cooper     test_no_kevents();
49*cb5fe245SEnji Cooper 
50*cb5fe245SEnji Cooper     /* Add the event, and then trigger it */
51*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL);
52*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
53*cb5fe245SEnji Cooper 
54*cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
55*cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
56*cb5fe245SEnji Cooper     kev.flags = EV_CLEAR;
57*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
58*cb5fe245SEnji Cooper 
59*cb5fe245SEnji Cooper     test_no_kevents();
60*cb5fe245SEnji Cooper 
61*cb5fe245SEnji Cooper     success();
62*cb5fe245SEnji Cooper }
63*cb5fe245SEnji Cooper 
64*cb5fe245SEnji Cooper static void
disable_and_enable(void)65*cb5fe245SEnji Cooper disable_and_enable(void)
66*cb5fe245SEnji Cooper {
67*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE)";
68*cb5fe245SEnji Cooper     struct kevent kev;
69*cb5fe245SEnji Cooper 
70*cb5fe245SEnji Cooper     test_begin(test_id);
71*cb5fe245SEnji Cooper 
72*cb5fe245SEnji Cooper     test_no_kevents();
73*cb5fe245SEnji Cooper 
74*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
75*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL);
76*cb5fe245SEnji Cooper 
77*cb5fe245SEnji Cooper     /* Trigger the event, but since it is disabled, nothing will happen. */
78*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
79*cb5fe245SEnji Cooper     test_no_kevents();
80*cb5fe245SEnji Cooper 
81*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL);
82*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
83*cb5fe245SEnji Cooper 
84*cb5fe245SEnji Cooper     kev.flags = EV_CLEAR;
85*cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
86*cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
87*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
88*cb5fe245SEnji Cooper 
89*cb5fe245SEnji Cooper     success();
90*cb5fe245SEnji Cooper }
91*cb5fe245SEnji Cooper 
92*cb5fe245SEnji Cooper static void
oneshot(void)93*cb5fe245SEnji Cooper oneshot(void)
94*cb5fe245SEnji Cooper {
95*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_ONESHOT)";
96*cb5fe245SEnji Cooper     struct kevent kev;
97*cb5fe245SEnji Cooper 
98*cb5fe245SEnji Cooper     test_begin(test_id);
99*cb5fe245SEnji Cooper 
100*cb5fe245SEnji Cooper     test_no_kevents();
101*cb5fe245SEnji Cooper 
102*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL);
103*cb5fe245SEnji Cooper 
104*cb5fe245SEnji Cooper     puts("  -- event 1");
105*cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
106*cb5fe245SEnji Cooper 
107*cb5fe245SEnji Cooper     kev.flags = EV_ONESHOT;
108*cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
109*cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
110*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
111*cb5fe245SEnji Cooper 
112*cb5fe245SEnji Cooper     test_no_kevents();
113*cb5fe245SEnji Cooper 
114*cb5fe245SEnji Cooper     success();
115*cb5fe245SEnji Cooper }
116*cb5fe245SEnji Cooper 
117*cb5fe245SEnji Cooper void
test_evfilt_user()118*cb5fe245SEnji Cooper test_evfilt_user()
119*cb5fe245SEnji Cooper {
120*cb5fe245SEnji Cooper     kqfd = kqueue();
121*cb5fe245SEnji Cooper 
122*cb5fe245SEnji Cooper     add_and_delete();
123*cb5fe245SEnji Cooper     event_wait();
124*cb5fe245SEnji Cooper     disable_and_enable();
125*cb5fe245SEnji Cooper     oneshot();
126*cb5fe245SEnji Cooper     /* TODO: try different fflags operations */
127*cb5fe245SEnji Cooper 
128*cb5fe245SEnji Cooper     close(kqfd);
129*cb5fe245SEnji Cooper }
130