TODO-TESTING tevent: ignore EBADF from EPOLL_CTL_ADD/MOD
authorStefan Metzmacher <metze@samba.org>
Wed, 20 Feb 2013 12:34:07 +0000 (13:34 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 26 Feb 2013 15:43:59 +0000 (16:43 +0100)
lib/tevent/tevent_epoll.c

index 6842dcf5f7b04d62a1d711a3a0a3f76a8cb45da2..6fee1c337c8bb995df1ec41315f875c279765431 100644 (file)
@@ -48,6 +48,7 @@ struct epoll_event_context {
 #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
 
@@ -278,7 +279,13 @@ static void epoll_add_event(struct epoll_event_context *epoll_ev, struct tevent_
        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;
        }
@@ -328,7 +335,13 @@ static void epoll_mod_event(struct epoll_event_context *epoll_ev, struct tevent_
        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;
        }
@@ -346,6 +359,10 @@ static void epoll_update_event(struct epoll_event_context *epoll_ev, struct teve
        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)) {