1*cb5fe245SEnji Cooper /* 2*cb5fe245SEnji Cooper * Copyright (c) 2009 Mark Heily <mark@heily.com> 3*cb5fe245SEnji Cooper * 4*cb5fe245SEnji Cooper * Permission to use, copy, modify, and distribute this software for any 5*cb5fe245SEnji Cooper * purpose with or without fee is hereby granted, provided that the above 6*cb5fe245SEnji Cooper * copyright notice and this permission notice appear in all copies. 7*cb5fe245SEnji Cooper * 8*cb5fe245SEnji Cooper * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*cb5fe245SEnji Cooper * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*cb5fe245SEnji Cooper * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*cb5fe245SEnji Cooper * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*cb5fe245SEnji Cooper * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*cb5fe245SEnji Cooper * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*cb5fe245SEnji Cooper * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*cb5fe245SEnji Cooper * 16*cb5fe245SEnji Cooper * $FreeBSD$ 17*cb5fe245SEnji Cooper */ 18*cb5fe245SEnji Cooper 19*cb5fe245SEnji Cooper #include "common.h" 20*cb5fe245SEnji Cooper 21*cb5fe245SEnji Cooper int kqfd; 22*cb5fe245SEnji Cooper 23*cb5fe245SEnji Cooper void 24*cb5fe245SEnji Cooper test_kevent_timer_add(void) 25*cb5fe245SEnji Cooper { 26*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_TIMER, EV_ADD)"; 27*cb5fe245SEnji Cooper struct kevent kev; 28*cb5fe245SEnji Cooper 29*cb5fe245SEnji Cooper test_begin(test_id); 30*cb5fe245SEnji Cooper 31*cb5fe245SEnji Cooper EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); 32*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 33*cb5fe245SEnji Cooper err(1, "%s", test_id); 34*cb5fe245SEnji Cooper 35*cb5fe245SEnji Cooper success(); 36*cb5fe245SEnji Cooper } 37*cb5fe245SEnji Cooper 38*cb5fe245SEnji Cooper void 39*cb5fe245SEnji Cooper test_kevent_timer_del(void) 40*cb5fe245SEnji Cooper { 41*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_TIMER, EV_DELETE)"; 42*cb5fe245SEnji Cooper struct kevent kev; 43*cb5fe245SEnji Cooper 44*cb5fe245SEnji Cooper test_begin(test_id); 45*cb5fe245SEnji Cooper 46*cb5fe245SEnji Cooper EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); 47*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 48*cb5fe245SEnji Cooper err(1, "%s", test_id); 49*cb5fe245SEnji Cooper 50*cb5fe245SEnji Cooper test_no_kevents(); 51*cb5fe245SEnji Cooper 52*cb5fe245SEnji Cooper success(); 53*cb5fe245SEnji Cooper } 54*cb5fe245SEnji Cooper 55*cb5fe245SEnji Cooper void 56*cb5fe245SEnji Cooper test_kevent_timer_get(void) 57*cb5fe245SEnji Cooper { 58*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_TIMER, wait)"; 59*cb5fe245SEnji Cooper struct kevent kev; 60*cb5fe245SEnji Cooper 61*cb5fe245SEnji Cooper test_begin(test_id); 62*cb5fe245SEnji Cooper 63*cb5fe245SEnji Cooper EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); 64*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 65*cb5fe245SEnji Cooper err(1, "%s", test_id); 66*cb5fe245SEnji Cooper 67*cb5fe245SEnji Cooper kev.flags |= EV_CLEAR; 68*cb5fe245SEnji Cooper kev.data = 1; 69*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd)); 70*cb5fe245SEnji Cooper 71*cb5fe245SEnji Cooper EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); 72*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 73*cb5fe245SEnji Cooper err(1, "%s", test_id); 74*cb5fe245SEnji Cooper 75*cb5fe245SEnji Cooper success(); 76*cb5fe245SEnji Cooper } 77*cb5fe245SEnji Cooper 78*cb5fe245SEnji Cooper static void 79*cb5fe245SEnji Cooper test_oneshot(void) 80*cb5fe245SEnji Cooper { 81*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_TIMER, EV_ONESHOT)"; 82*cb5fe245SEnji Cooper struct kevent kev; 83*cb5fe245SEnji Cooper 84*cb5fe245SEnji Cooper test_begin(test_id); 85*cb5fe245SEnji Cooper 86*cb5fe245SEnji Cooper test_no_kevents(); 87*cb5fe245SEnji Cooper 88*cb5fe245SEnji Cooper EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500,NULL); 89*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 90*cb5fe245SEnji Cooper err(1, "%s", test_id); 91*cb5fe245SEnji Cooper 92*cb5fe245SEnji Cooper /* Retrieve the event */ 93*cb5fe245SEnji Cooper kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT; 94*cb5fe245SEnji Cooper kev.data = 1; 95*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd)); 96*cb5fe245SEnji Cooper 97*cb5fe245SEnji Cooper /* Check if the event occurs again */ 98*cb5fe245SEnji Cooper sleep(3); 99*cb5fe245SEnji Cooper test_no_kevents(); 100*cb5fe245SEnji Cooper 101*cb5fe245SEnji Cooper 102*cb5fe245SEnji Cooper success(); 103*cb5fe245SEnji Cooper } 104*cb5fe245SEnji Cooper 105*cb5fe245SEnji Cooper static void 106*cb5fe245SEnji Cooper test_periodic(void) 107*cb5fe245SEnji Cooper { 108*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_TIMER, periodic)"; 109*cb5fe245SEnji Cooper struct kevent kev; 110*cb5fe245SEnji Cooper 111*cb5fe245SEnji Cooper test_begin(test_id); 112*cb5fe245SEnji Cooper 113*cb5fe245SEnji Cooper test_no_kevents(); 114*cb5fe245SEnji Cooper 115*cb5fe245SEnji Cooper EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 1000,NULL); 116*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 117*cb5fe245SEnji Cooper err(1, "%s", test_id); 118*cb5fe245SEnji Cooper 119*cb5fe245SEnji Cooper /* Retrieve the event */ 120*cb5fe245SEnji Cooper kev.flags = EV_ADD | EV_CLEAR; 121*cb5fe245SEnji Cooper kev.data = 1; 122*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd)); 123*cb5fe245SEnji Cooper 124*cb5fe245SEnji Cooper /* Check if the event occurs again */ 125*cb5fe245SEnji Cooper sleep(1); 126*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd)); 127*cb5fe245SEnji Cooper 128*cb5fe245SEnji Cooper /* Delete the event */ 129*cb5fe245SEnji Cooper kev.flags = EV_DELETE; 130*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 131*cb5fe245SEnji Cooper err(1, "%s", test_id); 132*cb5fe245SEnji Cooper 133*cb5fe245SEnji Cooper success(); 134*cb5fe245SEnji Cooper } 135*cb5fe245SEnji Cooper 136*cb5fe245SEnji Cooper static void 137*cb5fe245SEnji Cooper disable_and_enable(void) 138*cb5fe245SEnji Cooper { 139*cb5fe245SEnji Cooper const char *test_id = "kevent(EVFILT_TIMER, EV_DISABLE and EV_ENABLE)"; 140*cb5fe245SEnji Cooper struct kevent kev; 141*cb5fe245SEnji Cooper 142*cb5fe245SEnji Cooper test_begin(test_id); 143*cb5fe245SEnji Cooper 144*cb5fe245SEnji Cooper test_no_kevents(); 145*cb5fe245SEnji Cooper 146*cb5fe245SEnji Cooper /* Add the watch and immediately disable it */ 147*cb5fe245SEnji Cooper EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 2000,NULL); 148*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 149*cb5fe245SEnji Cooper err(1, "%s", test_id); 150*cb5fe245SEnji Cooper kev.flags = EV_DISABLE; 151*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 152*cb5fe245SEnji Cooper err(1, "%s", test_id); 153*cb5fe245SEnji Cooper test_no_kevents(); 154*cb5fe245SEnji Cooper 155*cb5fe245SEnji Cooper /* Re-enable and check again */ 156*cb5fe245SEnji Cooper kev.flags = EV_ENABLE; 157*cb5fe245SEnji Cooper if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) 158*cb5fe245SEnji Cooper err(1, "%s", test_id); 159*cb5fe245SEnji Cooper 160*cb5fe245SEnji Cooper kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT; 161*cb5fe245SEnji Cooper kev.data = 1; 162*cb5fe245SEnji Cooper kevent_cmp(&kev, kevent_get(kqfd)); 163*cb5fe245SEnji Cooper 164*cb5fe245SEnji Cooper success(); 165*cb5fe245SEnji Cooper } 166*cb5fe245SEnji Cooper 167*cb5fe245SEnji Cooper void 168*cb5fe245SEnji Cooper test_evfilt_timer() 169*cb5fe245SEnji Cooper { 170*cb5fe245SEnji Cooper kqfd = kqueue(); 171*cb5fe245SEnji Cooper test_kevent_timer_add(); 172*cb5fe245SEnji Cooper test_kevent_timer_del(); 173*cb5fe245SEnji Cooper test_kevent_timer_get(); 174*cb5fe245SEnji Cooper test_oneshot(); 175*cb5fe245SEnji Cooper test_periodic(); 176*cb5fe245SEnji Cooper disable_and_enable(); 177*cb5fe245SEnji Cooper close(kqfd); 178*cb5fe245SEnji Cooper } 179