2 #if defined(HAVE_EPOLL)
6 #if defined(HOST_WIN32)
7 /* We assume that epoll is not available on windows */
11 #define EPOLL_NEVENTS 128
14 static struct epoll_event *epoll_events;
17 epoll_init (gint wakeup_pipe_fd)
19 struct epoll_event event;
22 epoll_fd = epoll_create1 (EPOLL_CLOEXEC);
24 epoll_fd = epoll_create (256);
25 fcntl (epoll_fd, F_SETFD, FD_CLOEXEC);
30 g_error ("epoll_init: epoll (EPOLL_CLOEXEC) failed, error (%d) %s\n", errno, g_strerror (errno));
32 g_error ("epoll_init: epoll (256) failed, error (%d) %s\n", errno, g_strerror (errno));
37 event.events = EPOLLIN;
38 event.data.fd = wakeup_pipe_fd;
39 if (epoll_ctl (epoll_fd, EPOLL_CTL_ADD, event.data.fd, &event) == -1) {
40 g_error ("epoll_init: epoll_ctl () failed, error (%d) %s", errno, g_strerror (errno));
45 epoll_events = g_new0 (struct epoll_event, EPOLL_NEVENTS);
53 g_free (epoll_events);
58 epoll_register_fd (gint fd, gint events, gboolean is_new)
61 if (!is_new && epoll_ctl (epoll_fd, EPOLL_CTL_DEL, fd, NULL) == -1)
62 g_error ("epoll_register_fd: epoll_ctl (EPOLL_CTL_DEL) failed, error (%d) %s", errno, g_strerror (errno));
64 struct epoll_event event;
67 /* it was only defined on android in May 2013 */
68 #define EPOLLONESHOT 0x40000000
72 event.events = EPOLLONESHOT;
73 if ((events & MONO_POLLIN) != 0)
74 event.events |= EPOLLIN;
75 if ((events & MONO_POLLOUT) != 0)
76 event.events |= EPOLLOUT;
78 if (epoll_ctl (epoll_fd, is_new ? EPOLL_CTL_ADD : EPOLL_CTL_MOD, event.data.fd, &event) == -1)
79 g_error ("epoll_register_fd: epoll_ctl(%s) failed, error (%d) %s", is_new ? "EPOLL_CTL_ADD" : "EPOLL_CTL_MOD", errno, g_strerror (errno));
84 epoll_event_wait (void)
88 memset (epoll_events, 0, sizeof (struct epoll_event) * EPOLL_NEVENTS);
90 ready = epoll_wait (epoll_fd, epoll_events, EPOLL_NEVENTS, -1);
94 mono_thread_internal_check_for_interruption_critical (mono_thread_internal_current ());
98 g_error ("epoll_event_wait: epoll_wait () failed, error (%d) %s", errno, g_strerror (errno));
107 epoll_event_get_fd_max (void)
109 return EPOLL_NEVENTS;
113 epoll_event_get_fd_at (gint i, gint *events)
117 *events = ((epoll_events [i].events & (EPOLLIN | EPOLLERR | EPOLLHUP)) ? MONO_POLLIN : 0)
118 | ((epoll_events [i].events & (EPOLLOUT | EPOLLERR | EPOLLHUP)) ? MONO_POLLOUT : 0);
120 return epoll_events [i].data.fd;
123 static ThreadPoolIOBackend backend_epoll = {
125 .cleanup = epoll_cleanup,
126 .register_fd = epoll_register_fd,
127 .event_wait = epoll_event_wait,
128 .event_get_fd_max = epoll_event_get_fd_max,
129 .event_get_fd_at = epoll_event_get_fd_at,