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/timer.c 305467 2016-09-06 08:45:29Z ngie $ 17200483Srwatson */ 18200483Srwatson 19200483Srwatson#include "common.h" 20200483Srwatson 21200483Srwatsonint kqfd; 22200483Srwatson 23200483Srwatsonvoid 24200483Srwatsontest_kevent_timer_add(void) 25200483Srwatson{ 26200483Srwatson const char *test_id = "kevent(EVFILT_TIMER, EV_ADD)"; 27200483Srwatson struct kevent kev; 28200483Srwatson 29200483Srwatson test_begin(test_id); 30200483Srwatson 31200483Srwatson EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); 32200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 33200483Srwatson err(1, "%s", test_id); 34200483Srwatson 35200483Srwatson success(); 36200483Srwatson} 37200483Srwatson 38200483Srwatsonvoid 39200483Srwatsontest_kevent_timer_del(void) 40200483Srwatson{ 41200483Srwatson const char *test_id = "kevent(EVFILT_TIMER, EV_DELETE)"; 42200483Srwatson struct kevent kev; 43200483Srwatson 44200483Srwatson test_begin(test_id); 45200483Srwatson 46200483Srwatson EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); 47200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 48200483Srwatson err(1, "%s", test_id); 49200483Srwatson 50200483Srwatson test_no_kevents(); 51200483Srwatson 52200483Srwatson success(); 53200483Srwatson} 54200483Srwatson 55200483Srwatsonvoid 56200483Srwatsontest_kevent_timer_get(void) 57200483Srwatson{ 58200483Srwatson const char *test_id = "kevent(EVFILT_TIMER, wait)"; 59200483Srwatson struct kevent kev; 60200483Srwatson 61200483Srwatson test_begin(test_id); 62200483Srwatson 63200483Srwatson EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); 64200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 65200483Srwatson err(1, "%s", test_id); 66200483Srwatson 67200483Srwatson kev.flags |= EV_CLEAR; 68200483Srwatson kev.data = 1; 69200483Srwatson kevent_cmp(&kev, kevent_get(kqfd)); 70200483Srwatson 71200483Srwatson EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); 72200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 73200483Srwatson err(1, "%s", test_id); 74200483Srwatson 75200483Srwatson success(); 76200483Srwatson} 77200483Srwatson 78200483Srwatsonstatic void 79200483Srwatsontest_oneshot(void) 80200483Srwatson{ 81200483Srwatson const char *test_id = "kevent(EVFILT_TIMER, EV_ONESHOT)"; 82200483Srwatson struct kevent kev; 83200483Srwatson 84200483Srwatson test_begin(test_id); 85200483Srwatson 86200483Srwatson test_no_kevents(); 87200483Srwatson 88200483Srwatson EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500,NULL); 89200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 90200483Srwatson err(1, "%s", test_id); 91200483Srwatson 92200483Srwatson /* Retrieve the event */ 93200483Srwatson kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT; 94200483Srwatson kev.data = 1; 95200483Srwatson kevent_cmp(&kev, kevent_get(kqfd)); 96200483Srwatson 97200483Srwatson /* Check if the event occurs again */ 98200483Srwatson sleep(3); 99200483Srwatson test_no_kevents(); 100200483Srwatson 101200483Srwatson 102200483Srwatson success(); 103200483Srwatson} 104200483Srwatson 105200483Srwatsonstatic void 106200483Srwatsontest_periodic(void) 107200483Srwatson{ 108200483Srwatson const char *test_id = "kevent(EVFILT_TIMER, periodic)"; 109200483Srwatson struct kevent kev; 110200483Srwatson 111200483Srwatson test_begin(test_id); 112200483Srwatson 113200483Srwatson test_no_kevents(); 114200483Srwatson 115200483Srwatson EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 1000,NULL); 116200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 117200483Srwatson err(1, "%s", test_id); 118200483Srwatson 119200483Srwatson /* Retrieve the event */ 120200483Srwatson kev.flags = EV_ADD | EV_CLEAR; 121200483Srwatson kev.data = 1; 122200483Srwatson kevent_cmp(&kev, kevent_get(kqfd)); 123200483Srwatson 124200483Srwatson /* Check if the event occurs again */ 125200483Srwatson sleep(1); 126200483Srwatson kevent_cmp(&kev, kevent_get(kqfd)); 127200483Srwatson 128200483Srwatson /* Delete the event */ 129200483Srwatson kev.flags = EV_DELETE; 130200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 131200483Srwatson err(1, "%s", test_id); 132200483Srwatson 133200483Srwatson success(); 134200483Srwatson} 135200483Srwatson 136200483Srwatsonstatic void 137200483Srwatsondisable_and_enable(void) 138200483Srwatson{ 139200483Srwatson const char *test_id = "kevent(EVFILT_TIMER, EV_DISABLE and EV_ENABLE)"; 140200483Srwatson struct kevent kev; 141200483Srwatson 142200483Srwatson test_begin(test_id); 143200483Srwatson 144200483Srwatson test_no_kevents(); 145200483Srwatson 146200483Srwatson /* Add the watch and immediately disable it */ 147200483Srwatson EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 2000,NULL); 148200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 149200483Srwatson err(1, "%s", test_id); 150200483Srwatson kev.flags = EV_DISABLE; 151200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 152200483Srwatson err(1, "%s", test_id); 153200483Srwatson test_no_kevents(); 154200483Srwatson 155200483Srwatson /* Re-enable and check again */ 156200483Srwatson kev.flags = EV_ENABLE; 157200483Srwatson if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 158200483Srwatson err(1, "%s", test_id); 159200483Srwatson 160200483Srwatson kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT; 161200483Srwatson kev.data = 1; 162200483Srwatson kevent_cmp(&kev, kevent_get(kqfd)); 163200483Srwatson 164200483Srwatson success(); 165200483Srwatson} 166200483Srwatson 167200483Srwatsonvoid 168200483Srwatsontest_evfilt_timer() 169200483Srwatson{ 170200483Srwatson kqfd = kqueue(); 171200483Srwatson test_kevent_timer_add(); 172200483Srwatson test_kevent_timer_del(); 173200483Srwatson test_kevent_timer_get(); 174200483Srwatson test_oneshot(); 175200483Srwatson test_periodic(); 176200483Srwatson disable_and_enable(); 177200483Srwatson close(kqfd); 178200483Srwatson} 179