--- libev/ev_kqueue.c 2008/10/29 06:32:48 1.35 +++ libev/ev_kqueue.c 2011/06/02 23:34:05 1.49 @@ -1,19 +1,19 @@ /* * libev kqueue backend * - * Copyright (c) 2007,2008 Marc Alexander Lehmann + * Copyright (c) 2007,2008,2009,2010 Marc Alexander Lehmann * All rights reserved. * * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO @@ -39,7 +39,6 @@ #include #include -#include #include #include #include @@ -53,6 +52,10 @@ EV_SET (&kqueue_changes [kqueue_changecnt - 1], fd, filter, flags, fflags, 0, 0); } +/* OS X at least needs this */ +#ifndef EV_ENABLE +# define EV_ENABLE 0 +#endif #ifndef NOTE_EOF # define NOTE_EOF 0 #endif @@ -73,10 +76,10 @@ /* event requests even when oev == nev */ if (nev & EV_READ) - kqueue_change (EV_A_ fd, EVFILT_READ , EV_ADD, NOTE_EOF); + kqueue_change (EV_A_ fd, EVFILT_READ , EV_ADD | EV_ENABLE, NOTE_EOF); if (nev & EV_WRITE) - kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_ADD, NOTE_EOF); + kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, NOTE_EOF); } static void @@ -93,18 +96,19 @@ kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); } - ts.tv_sec = (time_t)timeout; - ts.tv_nsec = (long)((timeout - (ev_tstamp)ts.tv_sec) * 1e9); + EV_RELEASE_CB; + EV_TS_SET (ts, timeout); res = kevent (backend_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts); + EV_ACQUIRE_CB; kqueue_changecnt = 0; if (expect_false (res < 0)) - { + { if (errno != EINTR) ev_syserr ("(libev) kevent"); return; - } + } for (i = 0; i < res; ++i) { @@ -112,11 +116,11 @@ if (expect_false (kqueue_events [i].flags & EV_ERROR)) { - int err = kqueue_events [i].data; + int err = kqueue_events [i].data; /* we are only interested in errors for fds that we are interested in :) */ if (anfds [fd].events) - { + { if (err == ENOENT) /* resubmit changes on ENOENT */ kqueue_modify (EV_A_ fd, 0, anfds [fd].events); else if (err == EBADF) /* on EBADF, we re-check the fd */ @@ -128,7 +132,7 @@ } else /* on all other errors, we error out on the fd */ fd_kill (EV_A_ fd); - } + } } else fd_event ( @@ -151,13 +155,13 @@ int inline_size kqueue_init (EV_P_ int flags) { - /* Initalize the kernel queue */ + /* Initialize the kernel queue */ if ((backend_fd = kqueue ()) < 0) return 0; fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ - backend_fudge = 0.; + backend_fudge = 1e-9; /* apparently, they did the right thing in freebsd */ backend_modify = kqueue_modify; backend_poll = kqueue_poll;