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