1200483Srwatson/*
2200483Srwatson * Copyright (c) 2009 Mark Heily <mark@heily.com>
3200483Srwatson *
4200483Srwatson * Permission to use, copy, modify, and distribute this software for any
5200483Srwatson * purpose with or without fee is hereby granted, provided that the above
6200483Srwatson * copyright notice and this permission notice appear in all copies.
7200483Srwatson *
8200483Srwatson * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9200483Srwatson * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10200483Srwatson * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11200483Srwatson * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12200483Srwatson * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13200483Srwatson * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14200483Srwatson * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15200483Srwatson *
16200483Srwatson * $FreeBSD: stable/10/tests/sys/kqueue/libkqueue/user.c 305467 2016-09-06 08:45:29Z ngie $
17200483Srwatson */
18200483Srwatson
19200483Srwatson#include "common.h"
20200483Srwatson
21200483Srwatsonint kqfd;
22200483Srwatson
23200483Srwatsonstatic void
24200483Srwatsonadd_and_delete(void)
25200483Srwatson{
26200483Srwatson    const char *test_id = "kevent(EVFILT_USER, EV_ADD and EV_DELETE)";
27200483Srwatson    struct kevent kev;
28200483Srwatson
29200483Srwatson    test_begin(test_id);
30200483Srwatson
31200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
32200483Srwatson    test_no_kevents();
33200483Srwatson
34200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);
35200483Srwatson    test_no_kevents();
36200483Srwatson
37200483Srwatson    success();
38200483Srwatson}
39200483Srwatson
40200483Srwatsonstatic void
41200483Srwatsonevent_wait(void)
42200483Srwatson{
43200483Srwatson    const char *test_id = "kevent(EVFILT_USER, wait)";
44200483Srwatson    struct kevent kev;
45200483Srwatson
46200483Srwatson    test_begin(test_id);
47200483Srwatson
48200573Srwatson    test_no_kevents();
49200573Srwatson
50200483Srwatson    /* Add the event, and then trigger it */
51200573Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL);
52200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
53200483Srwatson
54200483Srwatson    kev.fflags &= ~NOTE_FFCTRLMASK;
55200483Srwatson    kev.fflags &= ~NOTE_TRIGGER;
56200573Srwatson    kev.flags = EV_CLEAR;
57200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
58200483Srwatson
59200483Srwatson    test_no_kevents();
60200483Srwatson
61200483Srwatson    success();
62200483Srwatson}
63200483Srwatson
64200483Srwatsonstatic void
65200483Srwatsondisable_and_enable(void)
66200483Srwatson{
67200483Srwatson    const char *test_id = "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE)";
68200483Srwatson    struct kevent kev;
69200483Srwatson
70200483Srwatson    test_begin(test_id);
71200483Srwatson
72200573Srwatson    test_no_kevents();
73200573Srwatson
74200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
75200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL);
76200483Srwatson
77200483Srwatson    /* Trigger the event, but since it is disabled, nothing will happen. */
78200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
79200483Srwatson    test_no_kevents();
80200483Srwatson
81200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL);
82200483Srwatson    kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
83200483Srwatson
84200573Srwatson    kev.flags = EV_CLEAR;
85200483Srwatson    kev.fflags &= ~NOTE_FFCTRLMASK;
86200483Srwatson    kev.fflags &= ~NOTE_TRIGGER;
87200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
88200483Srwatson
89200483Srwatson    success();
90200483Srwatson}
91200483Srwatson
92200483Srwatsonstatic void
93200483Srwatsononeshot(void)
94200483Srwatson{
95200483Srwatson    const char *test_id = "kevent(EVFILT_USER, EV_ONESHOT)";
96200483Srwatson    struct kevent kev;
97200483Srwatson
98200483Srwatson    test_begin(test_id);
99200483Srwatson
100200573Srwatson    test_no_kevents();
101200483Srwatson
102200573Srwatson    kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL);
103200573Srwatson
104200483Srwatson    puts("  -- event 1");
105200573Srwatson    kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
106200483Srwatson
107200573Srwatson    kev.flags = EV_ONESHOT;
108200483Srwatson    kev.fflags &= ~NOTE_FFCTRLMASK;
109200483Srwatson    kev.fflags &= ~NOTE_TRIGGER;
110200483Srwatson    kevent_cmp(&kev, kevent_get(kqfd));
111200483Srwatson
112200483Srwatson    test_no_kevents();
113200483Srwatson
114200483Srwatson    success();
115200483Srwatson}
116200483Srwatson
117200483Srwatsonvoid
118200483Srwatsontest_evfilt_user()
119200483Srwatson{
120200483Srwatson	kqfd = kqueue();
121200483Srwatson
122200483Srwatson    add_and_delete();
123200483Srwatson    event_wait();
124200483Srwatson    disable_and_enable();
125200483Srwatson    oneshot();
126200483Srwatson    /* TODO: try different fflags operations */
127200483Srwatson
128200483Srwatson	close(kqfd);
129200483Srwatson}
130