Path: blob/main/tests/sys/kqueue/libkqueue/user.c
101371 views
/*1* Copyright (c) 2009 Mark Heily <[email protected]>2*3* Permission to use, copy, modify, and distribute this software for any4* purpose with or without fee is hereby granted, provided that the above5* copyright notice and this permission notice appear in all copies.6*7* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES8* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF9* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR10* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES11* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN12* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF13* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.14*/1516#include "common.h"171819static void20add_and_delete(void)21{22const char *test_id = "kevent(EVFILT_USER, EV_ADD and EV_DELETE)";23struct kevent kev;2425test_begin(test_id);2627kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);28test_no_kevents();2930kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL);31test_no_kevents();3233success();34}3536static void37event_wait(void)38{39const char *test_id = "kevent(EVFILT_USER, wait)";40struct kevent kev;4142test_begin(test_id);4344test_no_kevents();4546/* Add the event, and then trigger it */47kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL);48kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);4950kev.fflags &= ~NOTE_FFCTRLMASK;51kev.fflags &= ~NOTE_TRIGGER;52kev.flags = EV_CLEAR;53kevent_cmp(&kev, kevent_get(kqfd));5455test_no_kevents();5657success();58}5960static void61event_wait_keepudata(void)62{63const char *test_id = "kevent(EVFILT_USER, wait w/ EV_KEEPUDATA)";64struct kevent kev;6566test_begin(test_id);6768test_no_kevents();6970kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, &kev);71kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0,72NULL);7374kev.fflags &= ~NOTE_FFCTRLMASK;75kev.fflags &= ~NOTE_TRIGGER;76kev.flags = EV_CLEAR;77kev.udata = &kev;78kevent_cmp(&kev, kevent_get(kqfd));7980test_no_kevents();8182success();83}848586static void87disable_and_enable(void)88{89const char *test_id = "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE)";90struct kevent kev;9192test_begin(test_id);9394test_no_kevents();9596kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);97kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL);9899/* Trigger the event, but since it is disabled, nothing will happen. */100kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);101test_no_kevents();102103kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL);104kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);105106kev.flags = EV_CLEAR;107kev.fflags &= ~NOTE_FFCTRLMASK;108kev.fflags &= ~NOTE_TRIGGER;109kevent_cmp(&kev, kevent_get(kqfd));110111success();112}113114static void115disable_and_enable_keepudata(void)116{117const char *test_id =118"kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE w/ EV_KEEPUDATA)";119struct kevent kev;120121test_begin(test_id);122123test_no_kevents();124125kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, &kev);126kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE | EV_KEEPUDATA, 0, 0,127NULL);128129/* Trigger the event, but since it is disabled, nothing will happen. */130kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0, NULL);131test_no_kevents();132133kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE | EV_KEEPUDATA, 0, 0,134NULL);135kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_KEEPUDATA, NOTE_TRIGGER, 0, NULL);136137kev.flags = EV_CLEAR;138kev.fflags &= ~NOTE_FFCTRLMASK;139kev.fflags &= ~NOTE_TRIGGER;140kev.udata = &kev;141kevent_cmp(&kev, kevent_get(kqfd));142143success();144}145146static void147oneshot(void)148{149const char *test_id = "kevent(EVFILT_USER, EV_ONESHOT)";150struct kevent kev;151152test_begin(test_id);153154test_no_kevents();155156kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL);157158puts(" -- event 1");159kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);160161kev.flags = EV_ONESHOT;162kev.fflags &= ~NOTE_FFCTRLMASK;163kev.fflags &= ~NOTE_TRIGGER;164kevent_cmp(&kev, kevent_get(kqfd));165166test_no_kevents();167168success();169}170171void172test_evfilt_user(void)173{174kqfd = kqueue();175176add_and_delete();177event_wait();178event_wait_keepudata();179disable_and_enable();180disable_and_enable_keepudata();181oneshot();182/* TODO: try different fflags operations */183184close(kqfd);185}186187188