… | |
… | |
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, */ |
… | |
… | |
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) |