mirror of
https://github.com/mpv-player/mpv
synced 2025-02-16 12:17:12 +00:00
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 <kkartaltepe@gmail.com>
This commit is contained in:
parent
a6e5eba6ab
commit
79bfcc6723
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user