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