xref: /freebsd/tests/sys/kqueue/libkqueue/timer.c (revision cb5fe245b1c7d476e3839126a11ee4305484f7de)
1*cb5fe245SEnji Cooper /*
2*cb5fe245SEnji Cooper  * Copyright (c) 2009 Mark Heily <mark@heily.com>
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 void
24*cb5fe245SEnji Cooper test_kevent_timer_add(void)
25*cb5fe245SEnji Cooper {
26*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_TIMER, EV_ADD)";
27*cb5fe245SEnji Cooper     struct kevent kev;
28*cb5fe245SEnji Cooper 
29*cb5fe245SEnji Cooper     test_begin(test_id);
30*cb5fe245SEnji Cooper 
31*cb5fe245SEnji Cooper     EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
32*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
33*cb5fe245SEnji Cooper         err(1, "%s", test_id);
34*cb5fe245SEnji Cooper 
35*cb5fe245SEnji Cooper     success();
36*cb5fe245SEnji Cooper }
37*cb5fe245SEnji Cooper 
38*cb5fe245SEnji Cooper void
39*cb5fe245SEnji Cooper test_kevent_timer_del(void)
40*cb5fe245SEnji Cooper {
41*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_TIMER, EV_DELETE)";
42*cb5fe245SEnji Cooper     struct kevent kev;
43*cb5fe245SEnji Cooper 
44*cb5fe245SEnji Cooper     test_begin(test_id);
45*cb5fe245SEnji Cooper 
46*cb5fe245SEnji Cooper     EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
47*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
48*cb5fe245SEnji Cooper         err(1, "%s", test_id);
49*cb5fe245SEnji Cooper 
50*cb5fe245SEnji Cooper     test_no_kevents();
51*cb5fe245SEnji Cooper 
52*cb5fe245SEnji Cooper     success();
53*cb5fe245SEnji Cooper }
54*cb5fe245SEnji Cooper 
55*cb5fe245SEnji Cooper void
56*cb5fe245SEnji Cooper test_kevent_timer_get(void)
57*cb5fe245SEnji Cooper {
58*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_TIMER, wait)";
59*cb5fe245SEnji Cooper     struct kevent kev;
60*cb5fe245SEnji Cooper 
61*cb5fe245SEnji Cooper     test_begin(test_id);
62*cb5fe245SEnji Cooper 
63*cb5fe245SEnji Cooper     EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL);
64*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
65*cb5fe245SEnji Cooper         err(1, "%s", test_id);
66*cb5fe245SEnji Cooper 
67*cb5fe245SEnji Cooper     kev.flags |= EV_CLEAR;
68*cb5fe245SEnji Cooper     kev.data = 1;
69*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
70*cb5fe245SEnji Cooper 
71*cb5fe245SEnji Cooper     EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
72*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
73*cb5fe245SEnji Cooper         err(1, "%s", test_id);
74*cb5fe245SEnji Cooper 
75*cb5fe245SEnji Cooper     success();
76*cb5fe245SEnji Cooper }
77*cb5fe245SEnji Cooper 
78*cb5fe245SEnji Cooper static void
79*cb5fe245SEnji Cooper test_oneshot(void)
80*cb5fe245SEnji Cooper {
81*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_TIMER, EV_ONESHOT)";
82*cb5fe245SEnji Cooper     struct kevent kev;
83*cb5fe245SEnji Cooper 
84*cb5fe245SEnji Cooper     test_begin(test_id);
85*cb5fe245SEnji Cooper 
86*cb5fe245SEnji Cooper     test_no_kevents();
87*cb5fe245SEnji Cooper 
88*cb5fe245SEnji Cooper     EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500,NULL);
89*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
90*cb5fe245SEnji Cooper         err(1, "%s", test_id);
91*cb5fe245SEnji Cooper 
92*cb5fe245SEnji Cooper     /* Retrieve the event */
93*cb5fe245SEnji Cooper     kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
94*cb5fe245SEnji Cooper     kev.data = 1;
95*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
96*cb5fe245SEnji Cooper 
97*cb5fe245SEnji Cooper     /* Check if the event occurs again */
98*cb5fe245SEnji Cooper     sleep(3);
99*cb5fe245SEnji Cooper     test_no_kevents();
100*cb5fe245SEnji Cooper 
101*cb5fe245SEnji Cooper 
102*cb5fe245SEnji Cooper     success();
103*cb5fe245SEnji Cooper }
104*cb5fe245SEnji Cooper 
105*cb5fe245SEnji Cooper static void
106*cb5fe245SEnji Cooper test_periodic(void)
107*cb5fe245SEnji Cooper {
108*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_TIMER, periodic)";
109*cb5fe245SEnji Cooper     struct kevent kev;
110*cb5fe245SEnji Cooper 
111*cb5fe245SEnji Cooper     test_begin(test_id);
112*cb5fe245SEnji Cooper 
113*cb5fe245SEnji Cooper     test_no_kevents();
114*cb5fe245SEnji Cooper 
115*cb5fe245SEnji Cooper     EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 1000,NULL);
116*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
117*cb5fe245SEnji Cooper         err(1, "%s", test_id);
118*cb5fe245SEnji Cooper 
119*cb5fe245SEnji Cooper     /* Retrieve the event */
120*cb5fe245SEnji Cooper     kev.flags = EV_ADD | EV_CLEAR;
121*cb5fe245SEnji Cooper     kev.data = 1;
122*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
123*cb5fe245SEnji Cooper 
124*cb5fe245SEnji Cooper     /* Check if the event occurs again */
125*cb5fe245SEnji Cooper     sleep(1);
126*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
127*cb5fe245SEnji Cooper 
128*cb5fe245SEnji Cooper     /* Delete the event */
129*cb5fe245SEnji Cooper     kev.flags = EV_DELETE;
130*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
131*cb5fe245SEnji Cooper         err(1, "%s", test_id);
132*cb5fe245SEnji Cooper 
133*cb5fe245SEnji Cooper     success();
134*cb5fe245SEnji Cooper }
135*cb5fe245SEnji Cooper 
136*cb5fe245SEnji Cooper static void
137*cb5fe245SEnji Cooper disable_and_enable(void)
138*cb5fe245SEnji Cooper {
139*cb5fe245SEnji Cooper     const char *test_id = "kevent(EVFILT_TIMER, EV_DISABLE and EV_ENABLE)";
140*cb5fe245SEnji Cooper     struct kevent kev;
141*cb5fe245SEnji Cooper 
142*cb5fe245SEnji Cooper     test_begin(test_id);
143*cb5fe245SEnji Cooper 
144*cb5fe245SEnji Cooper     test_no_kevents();
145*cb5fe245SEnji Cooper 
146*cb5fe245SEnji Cooper     /* Add the watch and immediately disable it */
147*cb5fe245SEnji Cooper     EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 2000,NULL);
148*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
149*cb5fe245SEnji Cooper         err(1, "%s", test_id);
150*cb5fe245SEnji Cooper     kev.flags = EV_DISABLE;
151*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
152*cb5fe245SEnji Cooper         err(1, "%s", test_id);
153*cb5fe245SEnji Cooper     test_no_kevents();
154*cb5fe245SEnji Cooper 
155*cb5fe245SEnji Cooper     /* Re-enable and check again */
156*cb5fe245SEnji Cooper     kev.flags = EV_ENABLE;
157*cb5fe245SEnji Cooper     if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
158*cb5fe245SEnji Cooper         err(1, "%s", test_id);
159*cb5fe245SEnji Cooper 
160*cb5fe245SEnji Cooper     kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT;
161*cb5fe245SEnji Cooper     kev.data = 1;
162*cb5fe245SEnji Cooper     kevent_cmp(&kev, kevent_get(kqfd));
163*cb5fe245SEnji Cooper 
164*cb5fe245SEnji Cooper     success();
165*cb5fe245SEnji Cooper }
166*cb5fe245SEnji Cooper 
167*cb5fe245SEnji Cooper void
168*cb5fe245SEnji Cooper test_evfilt_timer()
169*cb5fe245SEnji Cooper {
170*cb5fe245SEnji Cooper 	kqfd = kqueue();
171*cb5fe245SEnji Cooper     test_kevent_timer_add();
172*cb5fe245SEnji Cooper     test_kevent_timer_del();
173*cb5fe245SEnji Cooper     test_kevent_timer_get();
174*cb5fe245SEnji Cooper     test_oneshot();
175*cb5fe245SEnji Cooper     test_periodic();
176*cb5fe245SEnji Cooper     disable_and_enable();
177*cb5fe245SEnji Cooper 	close(kqfd);
178*cb5fe245SEnji Cooper }
179