29 #include <sys/sysctl.h>
30 #include <sys/types.h>
31 #include <sys/event.h>
45 #define EV_OOBAND EV_FLAG1
52 loop->backend_fd = kqueue();
53 if (
loop->backend_fd == -1)
62 #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
63 static int uv__has_forked_with_cfrunloop;
68 loop->backend_fd = -1;
73 #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
74 if (
loop->cf_state != NULL) {
85 uv__has_forked_with_cfrunloop = 1;
87 loop->cf_state = NULL;
99 EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, 0);
100 if (kevent(
loop->backend_fd, &ev, 1, NULL, 0, NULL))
103 EV_SET(&ev, fd, EVFILT_READ, EV_DELETE, 0, 0, 0);
105 if (kevent(
loop->backend_fd, &ev, 1, NULL, 0, NULL))
113 struct kevent events[1024];
115 struct timespec
spec;
116 unsigned int nevents;
117 unsigned int revents;
133 if (
loop->nfds == 0) {
148 assert(w->
fd < (
int)
loop->nwatchers);
150 if ((w->
events & POLLIN) == 0 && (w->
pevents & POLLIN) != 0) {
151 filter = EVFILT_READ;
156 filter = EVFILT_VNODE;
157 fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME
158 | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE;
159 op = EV_ADD | EV_ONESHOT;
162 EV_SET(events + nevents, w->
fd, filter,
op, fflags, 0, 0);
165 if (kevent(
loop->backend_fd, events, nevents, NULL, 0, NULL))
171 if ((w->
events & POLLOUT) == 0 && (w->
pevents & POLLOUT) != 0) {
172 EV_SET(events + nevents, w->
fd, EVFILT_WRITE, EV_ADD, 0, 0, 0);
175 if (kevent(
loop->backend_fd, events, nevents, NULL, 0, NULL))
182 EV_SET(events + nevents, w->
fd,
EV_OOBAND, EV_ADD, 0, 0, 0);
185 if (kevent(
loop->backend_fd, events, nevents, NULL, 0, NULL))
198 sigaddset(pset, SIGPROF);
205 for (;; nevents = 0) {
212 pthread_sigmask(SIG_BLOCK, pset, NULL);
214 nfds = kevent(
loop->backend_fd,
222 pthread_sigmask(SIG_UNBLOCK, pset, NULL);
252 assert(
loop->watchers != NULL);
253 loop->watchers[
loop->nwatchers] = (
void*) events;
255 for (
i = 0;
i < nfds;
i++) {
261 w =
loop->watchers[fd];
266 struct kevent events[1];
268 EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0);
269 if (kevent(
loop->backend_fd, events, 1, NULL, 0, NULL))
270 if (errno != EBADF && errno != ENOENT)
276 if (ev->filter == EVFILT_VNODE) {
277 assert(w->
events == POLLIN);
279 w->
cb(
loop, w, ev->fflags);
286 if (ev->filter == EVFILT_READ) {
289 w->rcount = ev->data;
292 struct kevent events[1];
293 EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0);
294 if (kevent(
loop->backend_fd, events, 1, NULL, 0, NULL))
303 w->rcount = ev->data;
306 struct kevent events[1];
307 EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0);
308 if (kevent(
loop->backend_fd, events, 1, NULL, 0, NULL))
314 if (ev->filter == EVFILT_WRITE) {
317 w->wcount = ev->data;
320 struct kevent events[1];
321 EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0);
322 if (kevent(
loop->backend_fd, events, 1, NULL, 0, NULL))
328 if (ev->flags & EV_ERROR)
340 if (w == &
loop->signal_io_watcher)
348 if (have_signals != 0)
349 loop->signal_io_watcher.cb(
loop, &
loop->signal_io_watcher, POLLIN);
351 loop->watchers[
loop->nwatchers] = NULL;
352 loop->watchers[
loop->nwatchers + 1] = NULL;
354 if (have_signals != 0)
385 struct kevent* events;
389 assert(
loop->watchers != NULL);
392 events = (
struct kevent*)
loop->watchers[
loop->nwatchers];
398 for (
i = 0;
i < nfds;
i++)
399 if ((
int) events[
i].ident == fd)
400 events[
i].ident = -1;
409 #if defined(F_GETPATH)
411 char pathbuf[MAXPATHLEN];
416 if (fflags & (NOTE_ATTRIB | NOTE_EXTEND))
422 #if defined(F_GETPATH)
427 if (fcntl(
handle->event_watcher.fd, F_GETPATH, pathbuf) == 0)
428 path = uv__basename_r(pathbuf);
432 if (
handle->event_watcher.fd == -1)
436 fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME
437 | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE;
439 EV_SET(&ev, w->
fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, fflags, 0, 0);
441 if (kevent(
loop->backend_fd, &ev, 1, NULL, 0, NULL))
455 unsigned int flags) {
457 #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
477 #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
484 if (fstat(fd, &statbuf))
487 if (!(statbuf.st_mode & S_IFDIR))
490 if (!uv__has_forked_with_cfrunloop) {
494 handle->event_watcher.fd = -1;
524 #if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
525 if (!uv__has_forked_with_cfrunloop &&
handle->cf_cb != NULL)
529 if (
handle->event_watcher.fd != -1) {
532 handle->event_watcher.fd = -1;