#define EPOLL_ADDITIONAL_FD_FLAG_HAS_EVENT (1<<0)
#define EPOLL_ADDITIONAL_FD_FLAG_REPORT_ERROR (1<<1)
#define EPOLL_ADDITIONAL_FD_FLAG_GOT_ERROR (1<<2)
+#define EPOLL_ADDITIONAL_FD_FLAG_EBADF (1<<3)
#ifdef TEST_PANIC_FALLBACK
event.events = epoll_map_flags(fde->flags);
event.data.ptr = fde;
ret = epoll_ctl(epoll_ev->epoll_fd, EPOLL_CTL_ADD, fde->fd, &event);
- if (ret != 0) {
+ if (ret != 0 && errno == EBADF) {
+ fde->additional_flags |= EPOLL_ADDITIONAL_FD_FLAG_EBADF;
+ tevent_debug(epoll_ev->ev, TEVENT_DEBUG_WARNING,
+ "EPOLL_CTL_ADD for fd[%d] ignoring EBADF\n",
+ fde->fd);
+ return;
+ } else if (ret != 0) {
epoll_panic(epoll_ev, "EPOLL_CTL_ADD failed", false);
return;
}
event.events = epoll_map_flags(fde->flags);
event.data.ptr = fde;
ret = epoll_ctl(epoll_ev->epoll_fd, EPOLL_CTL_MOD, fde->fd, &event);
- if (ret != 0) {
+ if (ret != 0 && errno == EBADF) {
+ fde->additional_flags |= EPOLL_ADDITIONAL_FD_FLAG_EBADF;
+ tevent_debug(epoll_ev->ev, TEVENT_DEBUG_WARNING,
+ "EPOLL_CTL_MOD for fd[%d] ignoring EBADF\n",
+ fde->fd);
+ return;
+ } else if (ret != 0) {
epoll_panic(epoll_ev, "EPOLL_CTL_MOD failed", false);
return;
}
bool want_read = (fde->flags & TEVENT_FD_READ);
bool want_write= (fde->flags & TEVENT_FD_WRITE);
+ if (fde->additional_flags & EPOLL_ADDITIONAL_FD_FLAG_EBADF) {
+ return;
+ }
+
/* there's already an event */
if (fde->additional_flags & EPOLL_ADDITIONAL_FD_FLAG_HAS_EVENT) {
if (want_read || (want_write && !got_error)) {