xref: /freebsd-13.1/tests/sys/kqueue/libkqueue/user.c (revision c9c283bd)
1cb5fe245SEnji Cooper /*
2cb5fe245SEnji Cooper  * Copyright (c) 2009 Mark Heily <[email protected]>
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  * $FreeBSD$
17cb5fe245SEnji Cooper  */
18cb5fe245SEnji Cooper 
19cb5fe245SEnji Cooper #include "common.h"
20cb5fe245SEnji Cooper 
21cb5fe245SEnji Cooper 
22cb5fe245SEnji Cooper static void
add_and_delete(void)23cb5fe245SEnji Cooper add_and_delete(void)
24cb5fe245SEnji Cooper {
25cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_ADD and EV_DELETE)";
26cb5fe245SEnji Cooper     struct kevent kev;
27cb5fe245SEnji Cooper 
28cb5fe245SEnji Cooper     test_begin(test_id);
29cb5fe245SEnji Cooper 
30cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
31cb5fe245SEnji Cooper     test_no_kevents();
32cb5fe245SEnji Cooper 
33cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);
34cb5fe245SEnji Cooper     test_no_kevents();
35cb5fe245SEnji Cooper 
36cb5fe245SEnji Cooper     success();
37cb5fe245SEnji Cooper }
38cb5fe245SEnji Cooper 
39cb5fe245SEnji Cooper static void
event_wait(void)40cb5fe245SEnji Cooper event_wait(void)
41cb5fe245SEnji Cooper {
42cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, wait)";
43cb5fe245SEnji Cooper     struct kevent kev;
44cb5fe245SEnji Cooper 
45cb5fe245SEnji Cooper     test_begin(test_id);
46cb5fe245SEnji Cooper 
47cb5fe245SEnji Cooper     test_no_kevents();
48cb5fe245SEnji Cooper 
49cb5fe245SEnji Cooper     /* Add the event, and then trigger it */
50cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL);
51cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
52cb5fe245SEnji Cooper 
53cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
54cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
55cb5fe245SEnji Cooper     kev.flags = EV_CLEAR;
56cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
57cb5fe245SEnji Cooper 
58cb5fe245SEnji Cooper     test_no_kevents();
59cb5fe245SEnji Cooper 
60cb5fe245SEnji Cooper     success();
61cb5fe245SEnji Cooper }
62cb5fe245SEnji Cooper 
63cb5fe245SEnji Cooper static void
disable_and_enable(void)64cb5fe245SEnji Cooper disable_and_enable(void)
65cb5fe245SEnji Cooper {
66cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE)";
67cb5fe245SEnji Cooper     struct kevent kev;
68cb5fe245SEnji Cooper 
69cb5fe245SEnji Cooper     test_begin(test_id);
70cb5fe245SEnji Cooper 
71cb5fe245SEnji Cooper     test_no_kevents();
72cb5fe245SEnji Cooper 
73cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
74cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL);
75cb5fe245SEnji Cooper 
76cb5fe245SEnji Cooper     /* Trigger the event, but since it is disabled, nothing will happen. */
77cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
78cb5fe245SEnji Cooper     test_no_kevents();
79cb5fe245SEnji Cooper 
80cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL);
81cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
82cb5fe245SEnji Cooper 
83cb5fe245SEnji Cooper     kev.flags = EV_CLEAR;
84cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
85cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
86cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
87cb5fe245SEnji Cooper 
88cb5fe245SEnji Cooper     success();
89cb5fe245SEnji Cooper }
90cb5fe245SEnji Cooper 
91cb5fe245SEnji Cooper static void
oneshot(void)92cb5fe245SEnji Cooper oneshot(void)
93cb5fe245SEnji Cooper {
94cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_USER, EV_ONESHOT)";
95cb5fe245SEnji Cooper     struct kevent kev;
96cb5fe245SEnji Cooper 
97cb5fe245SEnji Cooper     test_begin(test_id);
98cb5fe245SEnji Cooper 
99cb5fe245SEnji Cooper     test_no_kevents();
100cb5fe245SEnji Cooper 
101cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL);
102cb5fe245SEnji Cooper 
103cb5fe245SEnji Cooper     puts("  -- event 1");
104cb5fe245SEnji Cooper     kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
105cb5fe245SEnji Cooper 
106cb5fe245SEnji Cooper     kev.flags = EV_ONESHOT;
107cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_FFCTRLMASK;
108cb5fe245SEnji Cooper     kev.fflags &= ~NOTE_TRIGGER;
109cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
110cb5fe245SEnji Cooper 
111cb5fe245SEnji Cooper     test_no_kevents();
112cb5fe245SEnji Cooper 
113cb5fe245SEnji Cooper     success();
114cb5fe245SEnji Cooper }
115cb5fe245SEnji Cooper 
116cb5fe245SEnji Cooper void
test_evfilt_user(void)117*c9c283bdSAlex Richardson test_evfilt_user(void)
118cb5fe245SEnji Cooper {
119cb5fe245SEnji Cooper     kqfd = kqueue();
120cb5fe245SEnji Cooper 
121cb5fe245SEnji Cooper     add_and_delete();
122cb5fe245SEnji Cooper     event_wait();
123cb5fe245SEnji Cooper     disable_and_enable();
124cb5fe245SEnji Cooper     oneshot();
125cb5fe245SEnji Cooper     /* TODO: try different fflags operations */
126cb5fe245SEnji Cooper 
127cb5fe245SEnji Cooper     close(kqfd);
128cb5fe245SEnji Cooper }
129