1 /* $OpenBSD: kqueue-timer.c,v 1.1 2015/12/05 10:51:49 blambert 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 #include <sys/types.h> 18 #include <sys/time.h> 19 #include <sys/event.h> 20 #include <stdio.h> 21 #include <unistd.h> 22 #include <string.h> 23 24 int do_timer(void); 25 26 int 27 do_timer(void) 28 { 29 int kq, n; 30 struct kevent ev; 31 struct timespec ts; 32 33 if ((kq = kqueue()) == -1) 34 return (1); 35 36 memset(&ev, 0, sizeof(ev)); 37 ev.filter = EVFILT_TIMER; 38 ev.flags = EV_ADD | EV_ENABLE | EV_ONESHOT; 39 ev.data = 500; /* 1/2 second in ms */ 40 41 if (kevent(kq, &ev, 1, NULL, 0, NULL) == -1) 42 return (1); 43 44 ts.tv_sec = 2; /* wait 2s for kqueue timeout */ 45 ts.tv_nsec = 0; 46 47 if ((n = kevent(kq, NULL, 0, &ev, 1, &ts)) != 1) 48 return (1); 49 50 /* Now retry w/o EV_ONESHOT, as EV_CLEAR is implicit */ 51 52 memset(&ev, 0, sizeof(ev)); 53 ev.filter = EVFILT_TIMER; 54 ev.flags = EV_ADD | EV_ENABLE; 55 ev.data = 500; /* 1/2 second in ms */ 56 57 if (kevent(kq, &ev, 1, NULL, 0, NULL) == -1) 58 return (1); 59 60 ts.tv_sec = 2; /* wait 2s for kqueue timeout */ 61 ts.tv_nsec = 0; 62 63 if ((n = kevent(kq, NULL, 0, &ev, 1, &ts)) != 1) 64 return (1); 65 66 return (0); 67 } 68