mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 02:00:33 +00:00
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:
parent
eed2e9d52b
commit
c71dd72b21
1 changed files with 9 additions and 20 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue