--- libev/ev_kqueue.c 2007/12/25 07:05:45 1.33 +++ libev/ev_kqueue.c 2010/04/03 22:33:24 1.44 @@ -1,7 +1,7 @@ /* * libev kqueue backend * - * Copyright (c) 2007 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- @@ -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,15 +96,17 @@ kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); } + EV_RELEASE_CB; ts.tv_sec = (time_t)timeout; ts.tv_nsec = (long)((timeout - (ev_tstamp)ts.tv_sec) * 1e9); 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) - syserr ("(libev) kevent"); + ev_syserr ("(libev) kevent"); return; } @@ -112,11 +117,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 +133,7 @@ } else /* on all other errors, we error out on the fd */ fd_kill (EV_A_ fd); - } + } } else fd_event ( @@ -184,7 +189,7 @@ close (backend_fd); while ((backend_fd = kqueue ()) < 0) - syserr ("(libev) kqueue"); + ev_syserr ("(libev) kqueue"); fcntl (backend_fd, F_SETFD, FD_CLOEXEC);