… | |
… | |
88 | ev.data.u64 = (uint64_t)(uint32_t)fd |
88 | ev.data.u64 = (uint64_t)(uint32_t)fd |
89 | | ((uint64_t)(uint32_t)++anfds [fd].egen << 32); |
89 | | ((uint64_t)(uint32_t)++anfds [fd].egen << 32); |
90 | ev.events = (nev & EV_READ ? EPOLLIN : 0) |
90 | ev.events = (nev & EV_READ ? EPOLLIN : 0) |
91 | | (nev & EV_WRITE ? EPOLLOUT : 0); |
91 | | (nev & EV_WRITE ? EPOLLOUT : 0); |
92 | |
92 | |
93 | if (expect_true (!epoll_ctl (backend_fd, oev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev))) |
93 | if (expect_true (!epoll_ctl (backend_fd, oev && oldmask != nev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev))) |
94 | return; |
94 | return; |
95 | |
95 | |
96 | if (expect_true (errno == ENOENT)) |
96 | if (expect_true (errno == ENOENT)) |
97 | { |
97 | { |
98 | /* if ENOENT then the fd went away, so try to do the right thing */ |
98 | /* if ENOENT then the fd went away, so try to do the right thing */ |
… | |
… | |
168 | |
168 | |
169 | /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ |
169 | /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ |
170 | /* which is fortunately easy to do for us. */ |
170 | /* which is fortunately easy to do for us. */ |
171 | if (epoll_ctl (backend_fd, want ? EPOLL_CTL_MOD : EPOLL_CTL_DEL, fd, ev)) |
171 | if (epoll_ctl (backend_fd, want ? EPOLL_CTL_MOD : EPOLL_CTL_DEL, fd, ev)) |
172 | { |
172 | { |
173 | postfork = 1; /* an error occured, recreate kernel state */ |
173 | postfork = 1; /* an error occurred, recreate kernel state */ |
174 | continue; |
174 | continue; |
175 | } |
175 | } |
176 | } |
176 | } |
177 | |
177 | |
178 | fd_event (EV_A_ fd, got); |
178 | fd_event (EV_A_ fd, got); |