… | |
… | |
145 | { |
145 | { |
146 | int i; |
146 | int i; |
147 | int eventcnt; |
147 | int eventcnt; |
148 | |
148 | |
149 | if (ecb_expect_false (epoll_epermcnt)) |
149 | if (ecb_expect_false (epoll_epermcnt)) |
150 | timeout = 0.; |
150 | timeout = EV_TS_CONST (0.); |
151 | |
151 | |
152 | /* epoll wait times cannot be larger than (LONG_MAX - 999UL) / HZ msecs, which is below */ |
152 | /* epoll wait times cannot be larger than (LONG_MAX - 999UL) / HZ msecs, which is below */ |
153 | /* the default libev max wait time, however. */ |
153 | /* the default libev max wait time, however. */ |
154 | EV_RELEASE_CB; |
154 | EV_RELEASE_CB; |
155 | eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, timeout * 1e3); |
155 | eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, EV_TS_TO_MSEC (timeout)); |
156 | EV_ACQUIRE_CB; |
156 | EV_ACQUIRE_CB; |
157 | |
157 | |
158 | if (ecb_expect_false (eventcnt < 0)) |
158 | if (ecb_expect_false (eventcnt < 0)) |
159 | { |
159 | { |
160 | if (errno != EINTR) |
160 | if (errno != EINTR) |
… | |
… | |
195 | * when we are no longer interested in them, but also when we get spurious |
195 | * when we are no longer interested in them, but also when we get spurious |
196 | * notifications for fds from another process. this is partially handled |
196 | * notifications for fds from another process. this is partially handled |
197 | * above with the gencounter check (== our fd is not the event fd), and |
197 | * above with the gencounter check (== our fd is not the event fd), and |
198 | * partially here, when epoll_ctl returns an error (== a child has the fd |
198 | * partially here, when epoll_ctl returns an error (== a child has the fd |
199 | * but we closed it). |
199 | * but we closed it). |
|
|
200 | * note: for events such as POLLHUP, where we can't know whether it refers |
|
|
201 | * to EV_READ or EV_WRITE, we might issue redundant EPOLL_CTL_MOD calls. |
200 | */ |
202 | */ |
201 | ev->events = (want & EV_READ ? EPOLLIN : 0) |
203 | ev->events = (want & EV_READ ? EPOLLIN : 0) |
202 | | (want & EV_WRITE ? EPOLLOUT : 0); |
204 | | (want & EV_WRITE ? EPOLLOUT : 0); |
203 | |
205 | |
204 | /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ |
206 | /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ |
… | |
… | |
262 | epoll_init (EV_P_ int flags) |
264 | epoll_init (EV_P_ int flags) |
263 | { |
265 | { |
264 | if ((backend_fd = epoll_epoll_create ()) < 0) |
266 | if ((backend_fd = epoll_epoll_create ()) < 0) |
265 | return 0; |
267 | return 0; |
266 | |
268 | |
267 | backend_mintime = 1e-3; /* epoll does sometimes return early, this is just to avoid the worst */ |
269 | backend_mintime = EV_TS_CONST (1e-3); /* epoll does sometimes return early, this is just to avoid the worst */ |
268 | backend_modify = epoll_modify; |
270 | backend_modify = epoll_modify; |
269 | backend_poll = epoll_poll; |
271 | backend_poll = epoll_poll; |
270 | |
272 | |
271 | epoll_eventmax = 64; /* initial number of events receivable per poll */ |
273 | epoll_eventmax = 64; /* initial number of events receivable per poll */ |
272 | epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); |
274 | epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); |
… | |
… | |
280 | { |
282 | { |
281 | ev_free (epoll_events); |
283 | ev_free (epoll_events); |
282 | array_free (epoll_eperm, EMPTY); |
284 | array_free (epoll_eperm, EMPTY); |
283 | } |
285 | } |
284 | |
286 | |
285 | inline_size |
287 | ecb_cold |
286 | void |
288 | static void |
287 | epoll_fork (EV_P) |
289 | epoll_fork (EV_P) |
288 | { |
290 | { |
289 | close (backend_fd); |
291 | close (backend_fd); |
290 | |
292 | |
291 | while ((backend_fd = epoll_epoll_create ()) < 0) |
293 | while ((backend_fd = epoll_epoll_create ()) < 0) |