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_warning ("epoll_init: epoll (EPOLL_CLOEXEC) failed, error (%d) %s\n", errno, g_strerror (errno));
32 g_warning ("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_warning ("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_update_add (ThreadPoolIOUpdate *update)
60 struct epoll_event event;
62 event.data.fd = update->fd;
63 if ((update->events & MONO_POLLIN) != 0)
64 event.events |= EPOLLIN;
65 if ((update->events & MONO_POLLOUT) != 0)
66 event.events |= EPOLLOUT;
68 if (epoll_ctl (epoll_fd, update->is_new ? EPOLL_CTL_ADD : EPOLL_CTL_MOD, event.data.fd, &event) == -1)
69 g_warning ("epoll_update_add: epoll_ctl(%s) failed, error (%d) %s", update->is_new ? "EPOLL_CTL_ADD" : "EPOLL_CTL_MOD", errno, g_strerror (errno));
73 epoll_event_wait (void)
77 ready = epoll_wait (epoll_fd, epoll_events, EPOLL_NEVENTS, -1);
81 check_for_interruption_critical ();
85 g_warning ("epoll_event_wait: epoll_wait () failed, error (%d) %s", errno, g_strerror (errno));
94 epoll_event_max (void)
100 epoll_event_fd_at (guint i)
102 return epoll_events [i].data.fd;
106 epoll_event_create_sockares_at (guint i, gint fd, MonoMList **list)
108 struct epoll_event *epoll_event;
112 epoll_event = &epoll_events [i];
113 g_assert (epoll_event);
115 g_assert (fd == epoll_event->data.fd);
117 if (*list && (epoll_event->events & (EPOLLIN | EPOLLERR | EPOLLHUP)) != 0) {
118 MonoSocketAsyncResult *io_event = get_sockares_for_event (list, MONO_POLLIN);
120 mono_threadpool_ms_enqueue_work_item (((MonoObject*) io_event)->vtable->domain, (MonoObject*) io_event);
122 if (*list && (epoll_event->events & (EPOLLOUT | EPOLLERR | EPOLLHUP)) != 0) {
123 MonoSocketAsyncResult *io_event = get_sockares_for_event (list, MONO_POLLOUT);
125 mono_threadpool_ms_enqueue_work_item (((MonoObject*) io_event)->vtable->domain, (MonoObject*) io_event);
129 gint events = get_events (*list);
131 epoll_event->events = ((events & MONO_POLLOUT) ? EPOLLOUT : 0) | ((events & MONO_POLLIN) ? EPOLLIN : 0);
132 if (epoll_ctl (epoll_fd, EPOLL_CTL_MOD, fd, epoll_event) == -1) {
133 if (epoll_ctl (epoll_fd, EPOLL_CTL_ADD, fd, epoll_event) == -1)
134 g_warning ("epoll_event_create_sockares_at: epoll_ctl () failed, error (%d) %s", errno, g_strerror (errno));
137 epoll_ctl (epoll_fd, EPOLL_CTL_DEL, fd, epoll_event);
143 static ThreadPoolIOBackend backend_epoll = {
145 .cleanup = epoll_cleanup,
146 .update_add = epoll_update_add,
147 .event_wait = epoll_event_wait,
148 .event_max = epoll_event_max,
149 .event_fd_at = epoll_event_fd_at,
150 .event_create_sockares_at = epoll_event_create_sockares_at,