HACK epoll TEST_PANIC_FALLBACK
[metze/samba/wip.git] / lib / tevent / tevent_epoll.c
index 604a798e4452bd05948f3454f02c78488945c192..a909dc98a0532c8ab3c9cf7dd263b1cb3f910c2d 100644 (file)
@@ -32,6 +32,8 @@
 #include "tevent_internal.h"
 #include "tevent_util.h"
 
+#define TEST_PANIC_FALLBACK
+
 struct epoll_event_context {
        /* a pointer back to the generic event_context */
        struct tevent_context *ev;
@@ -163,7 +165,7 @@ static void epoll_panic(struct epoll_event_context *epoll_ev,
                abort();
        }
 
-       tevent_debug(ev, TEVENT_DEBUG_WARNING,
+       tevent_debug(ev, TEVENT_DEBUG_ERROR,
                     "%s (%s) replay[%u] - calling panic_fallback\n",
                     reason, strerror(errno), (unsigned)replay);
 
@@ -401,6 +403,13 @@ static void epoll_add_event(struct epoll_event_context *epoll_ev, struct tevent_
                        mpx_fde->event_ctx = NULL;
                }
                return;
+       } else if (ret != 0 && errno == EEXIST && mpx_fde == NULL) {
+               ret = epoll_add_multiplex_fd(epoll_ev, fde);
+               if (ret != 0) {
+                       epoll_panic(epoll_ev, "epoll_add_multiplex_fd failed",
+                                   false);
+                       return;
+               }
        } else if (ret != 0) {
                epoll_panic(epoll_ev, "EPOLL_CTL_ADD failed", false);
                return;
@@ -702,6 +711,16 @@ static int epoll_event_loop(struct epoll_event_context *epoll_ev, struct timeval
                if (events[i].events & EPOLLIN) flags |= TEVENT_FD_READ;
                if (events[i].events & EPOLLOUT) flags |= TEVENT_FD_WRITE;
 
+               if (flags & TEVENT_FD_WRITE) {
+                       if (fde->flags & TEVENT_FD_WRITE) {
+                               mpx_fde = NULL;
+                       }
+                       if (mpx_fde && mpx_fde->flags & TEVENT_FD_WRITE) {
+                               fde = mpx_fde;
+                               mpx_fde = NULL;
+                       }
+               }
+
                if (mpx_fde) {
                        /* Ensure we got the right fde. */
                        if ((flags & fde->flags) == 0) {
@@ -920,7 +939,7 @@ static const struct tevent_ops epoll_event_ops = {
        .set_fd_close_fn        = tevent_common_fd_set_close_fn,
        .get_fd_flags           = tevent_common_fd_get_flags,
        .set_fd_flags           = epoll_event_set_fd_flags,
-       .add_timer              = tevent_common_add_timer,
+       .add_timer              = tevent_common_add_timer_v2,
        .schedule_immediate     = tevent_common_schedule_immediate,
        .add_signal             = tevent_common_add_signal,
        .loop_once              = epoll_event_loop_once,