2 #if defined(HAVE_KQUEUE)
8 #if defined(HOST_WIN32)
9 /* We assume that kqueue is not available on windows */
13 #define KQUEUE_NEVENTS 128
15 static gint kqueue_fd;
16 static struct kevent *kqueue_events;
19 kqueue_init (gint wakeup_pipe_fd)
23 kqueue_fd = kqueue ();
24 if (kqueue_fd == -1) {
25 g_warning ("kqueue_init: kqueue () failed, error (%d) %s", errno, g_strerror (errno));
29 EV_SET (&event, wakeup_pipe_fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0);
30 if (kevent (kqueue_fd, &event, 1, NULL, 0, NULL) == -1) {
31 g_warning ("kqueue_init: kevent () failed, error (%d) %s", errno, g_strerror (errno));
36 kqueue_events = g_new0 (struct kevent, KQUEUE_NEVENTS);
44 g_free (kqueue_events);
49 kqueue_register_fd (gint fd, gint events, gboolean is_new)
56 if ((events & MONO_POLLIN) != 0)
57 EV_SET (&event, fd, EVFILT_READ, EV_ADD | EV_ENABLE | EV_ONESHOT, 0, 0, 0);
58 if ((events & MONO_POLLOUT) != 0)
59 EV_SET (&event, fd, EVFILT_WRITE, EV_ADD | EV_ENABLE | EV_ONESHOT, 0, 0, 0);
61 if (kevent (kqueue_fd, &event, 1, NULL, 0, NULL) == -1)
62 g_warning ("kqueue_register_fd: kevent(update) failed, error (%d) %s", errno, g_strerror (errno));
66 kqueue_event_wait (void)
70 ready = kevent (kqueue_fd, NULL, 0, kqueue_events, KQUEUE_NEVENTS, NULL);
74 mono_thread_internal_check_for_interruption_critical (mono_thread_internal_current ());
78 g_warning ("kqueue_event_wait: kevent () failed, error (%d) %s", errno, g_strerror (errno));
87 kqueue_event_get_fd_at (gint i, gint *events)
91 *events = ((kqueue_events [i].filter == EVFILT_READ || (kqueue_events [i].flags & EV_ERROR) != 0) ? MONO_POLLIN : 0)
92 | ((kqueue_events [i].filter == EVFILT_WRITE || (kqueue_events [i].flags & EV_ERROR) != 0) ? MONO_POLLOUT : 0);
94 return kqueue_events [i].ident;
98 kqueue_event_get_fd_max (void)
100 return KQUEUE_NEVENTS;
103 static ThreadPoolIOBackend backend_kqueue = {
105 .cleanup = kqueue_cleanup,
106 .register_fd = kqueue_register_fd,
107 .event_wait = kqueue_event_wait,
108 .event_get_fd_max = kqueue_event_get_fd_max,
109 .event_get_fd_at = kqueue_event_get_fd_at,