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 <christopher.halse.rogers@canonical.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
diff --git a/src/event-loop.c b/src/event-loop.c
index 49e48bf..eb2dce6 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>
@@ -559,19 +560,26 @@
 	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 @@
 {
 	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_idle(loop);
 
-	do {
-		n = post_dispatch_check(loop);
-	} while (n > 0);
+	while (post_dispatch_check(loop));
 
 	return 0;
 }