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>
This commit is contained in:
Christopher James Halse Rogers 2017-08-28 18:03:38 +10:00 committed by Daniel Stone
parent 698dde1958
commit ed7ad31ac2

View file

@ -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 @@ 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;
}