gl/wayland: fix glib mainloop integration

Implement the prepare and check functions according to the
documentation by returning TRUE when events should be dispatched
via the dispatch function.

As wl_display_read_events never blocks we can call it unconditionally
without looking at the poll status.

This simplifies the implementation and gets rid of a race where the
mainloop could get blocked due to nobody actually reading the events
from the wayland connection.
This commit is contained in:
Lucas Stach 2019-03-08 19:52:25 +01:00
parent eed2e9d52b
commit c71dd72b21

View file

@ -128,19 +128,13 @@ wayland_event_source_prepare (GSource * base, gint * timeout)
wl_display_cancel_read (source->display);
if (source->queue) {
while (wl_display_prepare_read_queue (source->display, source->queue) != 0) {
if (wl_display_dispatch_queue_pending (source->display,
source->queue) < 0) {
g_critical ("Failed to dispatch pending events\n");
}
}
if (wl_display_prepare_read_queue (source->display, source->queue) != 0)
return TRUE;
} else {
while (wl_display_prepare_read (source->display) != 0) {
if (wl_display_dispatch_pending (source->display) < 0) {
g_critical ("Failed to dispatch pending events\n");
}
}
if (wl_display_prepare_read (source->display) != 0)
return TRUE;
}
source->reading = TRUE;
/* FIXME: this may return EAGAIN if the fd is full */
@ -154,18 +148,13 @@ static gboolean
wayland_event_source_check (GSource * base)
{
WaylandEventSource *source = (WaylandEventSource *) base;
gboolean retval;
retval = source->pfd.revents;
if (source->pfd.revents & G_IO_IN) {
wl_display_read_events (source->display);
} else {
wl_display_cancel_read (source->display);
}
source->reading = FALSE;
return retval;
if (wl_display_read_events (source->display) == 0)
return TRUE;
return FALSE;
}
static gboolean