mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-10-29 05:40:16 -04:00
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:
parent
698dde1958
commit
ed7ad31ac2
1 changed files with 16 additions and 10 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue