From: Christopher James Halse Rogers <[email protected]>
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 <[email protected]> --- 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 6130d2a..fc059bf 100644 --- a/src/event-loop.c +++ b/src/event-loop.c @@ -29,6 +29,7 @@ #include <signal.h> #include <stdlib.h> #include <stdint.h> +#include <stdbool.h> #include <string.h> #include <fcntl.h> #include <sys/socket.h> @@ -376,19 +377,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; + + 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 n; + return needs_recheck; } WL_EXPORT void @@ -409,7 +417,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); @@ -427,9 +435,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; } -- 2.14.1 _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
