+#endif
+
+#ifdef HAVE_KQUEUE
+ const struct kevent change[] = {
+ {
+ .ident = io->fd,
+ .filter = EVFILT_READ,
+ .flags = EV_RECEIPT | (flags & IO_READ ? EV_ADD : EV_DELETE),
+ .udata = io,
+ },
+ {
+ .ident = io->fd,
+ .filter = EVFILT_WRITE,
+ .flags = EV_RECEIPT | (flags & IO_WRITE ? EV_ADD : EV_DELETE),
+ .udata = io,
+ },
+ };
+ struct kevent result[2];
+
+ if(kevent(event_fd, change, 2, result, 2, NULL) < 0) {
+ logger(DEBUG_ALWAYS, LOG_EMERG, "kevent failed: %s", strerror(errno));
+ abort();
+ }
+
+ int rerr = (int)result[0].data;
+ int werr = (int)result[1].data;
+
+ if((rerr && rerr != ENOENT) || (werr && werr != ENOENT)) {
+ logger(DEBUG_ALWAYS, LOG_EMERG, "kevent errors: %s, %s", strerror(rerr), strerror(werr));
+ abort();
+ }
+
+ if(!flags) {
+ io_tree.generation++;
+ }
+
+#endif
+
+#ifdef HAVE_SELECT