From ed7ad31ac2fa3fb1aa03ed1435e6673b6b070f55 Mon Sep 17 00:00:00 2001 From: Christopher James Halse Rogers Date: Mon, 28 Aug 2017 18:03:38 +1000 Subject: [PATCH] eventloop: clarify post_dispatch_check() This *technically* changes the semantics of the return value of the source callbacks. Previously you could return a negative number from a source callback and it would prevent *other* source callbacks from triggering a subsequent recheck. Doing that seems like such a bad idea it's not worth supporting. v2: Log this case if it is hit, so we don't silently change behaviour. Signed-off-by: Christopher James Halse Rogers Reviewed-by: Daniel Stone --- src/event-loop.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/event-loop.c b/src/event-loop.c index 49e48bf4..eb2dce63 100644 --- a/src/event-loop.c +++ b/src/event-loop.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -559,19 +560,26 @@ wl_event_loop_destroy(struct wl_event_loop *loop) free(loop); } -static int +static bool post_dispatch_check(struct wl_event_loop *loop) { struct epoll_event ep; struct wl_event_source *source, *next; - int n; + bool needs_recheck = false; ep.events = 0; - n = 0; - wl_list_for_each_safe(source, next, &loop->check_list, link) - n += source->interface->dispatch(source, &ep); + wl_list_for_each_safe(source, next, &loop->check_list, link) { + int dispatch_result; - return n; + dispatch_result = source->interface->dispatch(source, &ep); + if (dispatch_result < 0) { + wl_log("Source dispatch function returned negative value!"); + wl_log("This would previously accidentally suppress a follow-up dispatch"); + } + needs_recheck |= dispatch_result != 0; + } + + return needs_recheck; } /** Dispatch the idle sources @@ -619,7 +627,7 @@ wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout) { struct epoll_event ep[32]; struct wl_event_source *source; - int i, count, n; + int i, count; wl_event_loop_dispatch_idle(loop); @@ -637,9 +645,7 @@ wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout) wl_event_loop_dispatch_idle(loop); - do { - n = post_dispatch_check(loop); - } while (n > 0); + while (post_dispatch_check(loop)); return 0; }