Path: blob/main/tests/sys/kqueue/libkqueue/signal.c
39566 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 void20test_kevent_signal_add(void)21{22const char *test_id = "kevent(EVFILT_SIGNAL, EV_ADD)";23struct kevent kev;2425test_begin(test_id);2627EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);28if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)29err(1, "%s", test_id);3031success();32}3334static void35test_kevent_signal_get(void)36{37const char *test_id = "kevent(EVFILT_SIGNAL, wait)";38struct kevent kev;3940test_begin(test_id);4142EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);43if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)44err(1, "%s", test_id);4546/* Block SIGUSR1, then send it to ourselves */47sigset_t mask;48sigemptyset(&mask);49sigaddset(&mask, SIGUSR1);50if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)51err(1, "sigprocmask");52if (kill(getpid(), SIGUSR1) < 0)53err(1, "kill");5455kev.flags |= EV_CLEAR;56kev.data = 1;57kevent_cmp(&kev, kevent_get(kqfd));5859success();60}6162static void63test_kevent_signal_disable(void)64{65const char *test_id = "kevent(EVFILT_SIGNAL, EV_DISABLE)";66struct kevent kev;6768test_begin(test_id);6970EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DISABLE, 0, 0, NULL);71if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)72err(1, "%s", test_id);7374/* Block SIGUSR1, then send it to ourselves */75sigset_t mask;76sigemptyset(&mask);77sigaddset(&mask, SIGUSR1);78if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)79err(1, "sigprocmask");80if (kill(getpid(), SIGUSR1) < 0)81err(1, "kill");8283test_no_kevents();8485success();86}8788static void89test_kevent_signal_enable(void)90{91const char *test_id = "kevent(EVFILT_SIGNAL, EV_ENABLE)";92struct kevent kev;9394test_begin(test_id);9596EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ENABLE, 0, 0, NULL);97if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)98err(1, "%s", test_id);99100/* Block SIGUSR1, then send it to ourselves */101sigset_t mask;102sigemptyset(&mask);103sigaddset(&mask, SIGUSR1);104if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)105err(1, "sigprocmask");106if (kill(getpid(), SIGUSR1) < 0)107err(1, "kill");108109kev.flags = EV_ADD | EV_CLEAR;110#if LIBKQUEUE111kev.data = 1; /* WORKAROUND */112#else113kev.data = 2; // one extra time from test_kevent_signal_disable()114#endif115kevent_cmp(&kev, kevent_get(kqfd));116117/* Delete the watch */118kev.flags = EV_DELETE;119if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)120err(1, "%s", test_id);121122success();123}124125static void126test_kevent_signal_del(void)127{128const char *test_id = "kevent(EVFILT_SIGNAL, EV_DELETE)";129struct kevent kev;130131test_begin(test_id);132133/* Delete the kevent */134EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DELETE, 0, 0, NULL);135if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)136err(1, "%s", test_id);137138/* Block SIGUSR1, then send it to ourselves */139sigset_t mask;140sigemptyset(&mask);141sigaddset(&mask, SIGUSR1);142if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)143err(1, "sigprocmask");144if (kill(getpid(), SIGUSR1) < 0)145err(1, "kill");146147test_no_kevents();148success();149}150151static void152test_kevent_signal_oneshot(void)153{154const char *test_id = "kevent(EVFILT_SIGNAL, EV_ONESHOT)";155struct kevent kev;156157test_begin(test_id);158159EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD | EV_ONESHOT, 0, 0, NULL);160if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)161err(1, "%s", test_id);162163/* Block SIGUSR1, then send it to ourselves */164sigset_t mask;165sigemptyset(&mask);166sigaddset(&mask, SIGUSR1);167if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)168err(1, "sigprocmask");169if (kill(getpid(), SIGUSR1) < 0)170err(1, "kill");171172kev.flags |= EV_CLEAR;173kev.data = 1;174kevent_cmp(&kev, kevent_get(kqfd));175176/* Send another one and make sure we get no events */177if (kill(getpid(), SIGUSR1) < 0)178err(1, "kill");179test_no_kevents();180181success();182}183184void185test_evfilt_signal(void)186{187kqfd = kqueue();188test_kevent_signal_add();189test_kevent_signal_del();190test_kevent_signal_get();191test_kevent_signal_disable();192test_kevent_signal_enable();193test_kevent_signal_oneshot();194close(kqfd);195}196197198