mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-05 02:02:26 +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);
|
wl_display_cancel_read (source->display);
|
||||||
|
|
||||||
if (source->queue) {
|
if (source->queue) {
|
||||||
while (wl_display_prepare_read_queue (source->display, source->queue) != 0) {
|
if (wl_display_prepare_read_queue (source->display, source->queue) != 0)
|
||||||
if (wl_display_dispatch_queue_pending (source->display,
|
return TRUE;
|
||||||
source->queue) < 0) {
|
|
||||||
g_critical ("Failed to dispatch pending events\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
while (wl_display_prepare_read (source->display) != 0) {
|
if (wl_display_prepare_read (source->display) != 0)
|
||||||
if (wl_display_dispatch_pending (source->display) < 0) {
|
return TRUE;
|
||||||
g_critical ("Failed to dispatch pending events\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
source->reading = TRUE;
|
source->reading = TRUE;
|
||||||
|
|
||||||
/* FIXME: this may return EAGAIN if the fd is full */
|
/* FIXME: this may return EAGAIN if the fd is full */
|
||||||
|
@ -154,18 +148,13 @@ static gboolean
|
||||||
wayland_event_source_check (GSource * base)
|
wayland_event_source_check (GSource * base)
|
||||||
{
|
{
|
||||||
WaylandEventSource *source = (WaylandEventSource *) 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;
|
source->reading = FALSE;
|
||||||
|
|
||||||
return retval;
|
if (wl_display_read_events (source->display) == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
Loading…
Reference in a new issue