From 79bfcc672343ddbc348e040ad899d61a0bafc050 Mon Sep 17 00:00:00 2001 From: Kurt Kartaltepe Date: Wed, 24 Nov 2021 16:40:31 -0800 Subject: wayland: cancel prepared reads when no events A read can be prepared on the wayland display FD that is never actually read. This occurs when events are triggered on other FDs in the fd set. This change cancels a prepared read if poll reported no events for it. This fixes some hangs due to how nvidia's EGL implementation polls on the wayland fd unlike mesa implementations. It is based on nvidia's proposed fix for qt's similar message pump in https://codereview.qt-project.org/c/qt/qtwayland/+/373473 Signed-off-by: Kurt Kartaltepe --- video/out/wayland_common.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'video/out') diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index 62f471210b..cae0c6a5d3 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -1518,21 +1518,23 @@ static void vo_wayland_dispatch_events(struct vo_wayland_state *wl, int nfds, in poll(fds, nfds, timeout); + if (fds[0].revents & POLLIN) { + wl_display_read_events(wl->display); + } else { + wl_display_cancel_read(wl->display); + } + if (fds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) { MP_FATAL(wl, "Error occurred on the display fd, closing\n"); - wl_display_cancel_read(wl->display); close(wl->display_fd); wl->display_fd = -1; mp_input_put_key(wl->vo->input_ctx, MP_KEY_CLOSE_WIN); - } else { - wl_display_read_events(wl->display); } - if (fds[0].revents & POLLIN) - wl_display_dispatch_pending(wl->display); - if (fds[1].revents & POLLIN) mp_flush_wakeup_pipe(wl->wakeup_pipe[0]); + + wl_display_dispatch_pending(wl->display); } /* Non-static */ -- cgit v1.2.3