5 #if defined(HAVE_EPOLL)
9 #if defined(HOST_WIN32)
10 /* We assume that epoll is not available on windows */
14 #define EPOLL_NEVENTS 128
17 static struct epoll_event *epoll_events;
20 epoll_init (gint wakeup_pipe_fd)
22 struct epoll_event event;
25 epoll_fd = epoll_create1 (EPOLL_CLOEXEC);
27 epoll_fd = epoll_create (256);
28 fcntl (epoll_fd, F_SETFD, FD_CLOEXEC);
33 g_error ("epoll_init: epoll (EPOLL_CLOEXEC) failed, error (%d) %s\n", errno, g_strerror (errno));
35 g_error ("epoll_init: epoll (256) failed, error (%d) %s\n", errno, g_strerror (errno));
40 event.events = EPOLLIN;
41 event.data.fd = wakeup_pipe_fd;
42 if (epoll_ctl (epoll_fd, EPOLL_CTL_ADD, event.data.fd, &event) == -1) {
43 g_error ("epoll_init: epoll_ctl () failed, error (%d) %s", errno, g_strerror (errno));
48 epoll_events = g_new0 (struct epoll_event, EPOLL_NEVENTS);
54 epoll_register_fd (gint fd, gint events, gboolean is_new)
56 struct epoll_event event;
59 /* it was only defined on android in May 2013 */
60 #define EPOLLONESHOT 0x40000000
64 event.events = EPOLLONESHOT;
65 if ((events & EVENT_IN) != 0)
66 event.events |= EPOLLIN;
67 if ((events & EVENT_OUT) != 0)
68 event.events |= EPOLLOUT;
70 if (epoll_ctl (epoll_fd, is_new ? EPOLL_CTL_ADD : EPOLL_CTL_MOD, event.data.fd, &event) == -1)
71 g_error ("epoll_register_fd: epoll_ctl(%s) failed, error (%d) %s", is_new ? "EPOLL_CTL_ADD" : "EPOLL_CTL_MOD", errno, g_strerror (errno));
75 epoll_remove_fd (gint fd)
77 if (epoll_ctl (epoll_fd, EPOLL_CTL_DEL, fd, NULL) == -1)
78 g_error ("epoll_remove_fd: epoll_ctl (EPOLL_CTL_DEL) failed, error (%d) %s", errno, g_strerror (errno));
82 epoll_event_wait (void (*callback) (gint fd, gint events, gpointer user_data), gpointer user_data)
86 memset (epoll_events, 0, sizeof (struct epoll_event) * EPOLL_NEVENTS);
88 mono_gc_set_skip_thread (TRUE);
91 ready = epoll_wait (epoll_fd, epoll_events, EPOLL_NEVENTS, -1);
94 mono_gc_set_skip_thread (FALSE);
102 g_error ("epoll_event_wait: epoll_wait () failed, error (%d) %s", errno, g_strerror (errno));
110 for (i = 0; i < ready; ++i) {
113 fd = epoll_events [i].data.fd;
114 if (epoll_events [i].events & (EPOLLIN | EPOLLERR | EPOLLHUP))
116 if (epoll_events [i].events & (EPOLLOUT | EPOLLERR | EPOLLHUP))
119 callback (fd, events, user_data);
125 static ThreadPoolIOBackend backend_epoll = {
127 .register_fd = epoll_register_fd,
128 .remove_fd = epoll_remove_fd,
129 .event_wait = epoll_event_wait,