1 /* $OpenBSD: kqueue-timer.c,v 1.2 2016/09/20 23:05:27 bluhm Exp $ */ 2 /* 3 * Copyright (c) 2015 Bret Stephen Lambert <blambert@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <sys/types.h> 19 #include <sys/time.h> 20 #include <sys/event.h> 21 22 #include <err.h> 23 #include <stdio.h> 24 #include <string.h> 25 #include <unistd.h> 26 27 #include "main.h" 28 29 int 30 do_timer(void) 31 { 32 int kq, n; 33 struct kevent ev; 34 struct timespec ts; 35 36 ASS((kq = kqueue()) >= 0, 37 warn("kqueue")); 38 39 memset(&ev, 0, sizeof(ev)); 40 ev.filter = EVFILT_TIMER; 41 ev.flags = EV_ADD | EV_ENABLE | EV_ONESHOT; 42 ev.data = 500; /* 1/2 second in ms */ 43 44 n = kevent(kq, &ev, 1, NULL, 0, NULL); 45 ASSX(n != -1); 46 47 ts.tv_sec = 2; /* wait 2s for kqueue timeout */ 48 ts.tv_nsec = 0; 49 50 n = kevent(kq, NULL, 0, &ev, 1, &ts); 51 ASSX(n == 1); 52 53 /* Now retry w/o EV_ONESHOT, as EV_CLEAR is implicit */ 54 55 memset(&ev, 0, sizeof(ev)); 56 ev.filter = EVFILT_TIMER; 57 ev.flags = EV_ADD | EV_ENABLE; 58 ev.data = 500; /* 1/2 second in ms */ 59 60 n = kevent(kq, &ev, 1, NULL, 0, NULL); 61 ASSX(n != -1); 62 63 ts.tv_sec = 2; /* wait 2s for kqueue timeout */ 64 ts.tv_nsec = 0; 65 66 n = kevent(kq, NULL, 0, &ev, 1, &ts); 67 ASSX(n == 1); 68 69 return (0); 70 } 71