Merge branch 'handle-display-roundtrip-failure'

Closes #542
This commit is contained in:
Daniel Eklöf 2021-05-25 17:50:29 +02:00
commit 37db94078f
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 19 additions and 5 deletions

View file

@ -126,6 +126,9 @@
* Rare occurrences where the window did not close when the shell
exited. Only seen on FreeBSD
(https://codeberg.org/dnkl/foot/issues/534)
* Foot process(es) sometimes remaining, using 100% CPU, when closing
multiple foot windows at the same time
(https://codeberg.org/dnkl/foot/issues/542).
### Security

View file

@ -1126,8 +1126,12 @@ fdm_wayl(struct fdm *fdm, int fd, int events, void *data)
return false;
}
while (wl_display_prepare_read(wayl->display) != 0)
wl_display_dispatch_pending(wayl->display);
while (wl_display_prepare_read(wayl->display) != 0) {
if (wl_display_dispatch_pending(wayl->display) < 0) {
LOG_ERRNO("failed to dispatch pending Wayland events");
return false;
}
}
}
if (events & EPOLLHUP) {
@ -1589,14 +1593,21 @@ void
wayl_roundtrip(struct wayland *wayl)
{
wl_display_cancel_read(wayl->display);
wl_display_roundtrip(wayl->display);
if (wl_display_roundtrip(wayl->display) < 0) {
LOG_ERRNO("failed to roundtrip Wayland display");
return;
}
/* I suspect the roundtrip above clears the pending queue, and
* that prepare_read() will always succeed in the first call. But,
* better safe than sorry... */
while (wl_display_prepare_read(wayl->display) != 0)
wl_display_dispatch_pending(wayl->display);
while (wl_display_prepare_read(wayl->display) != 0) {
if (wl_display_dispatch_pending(wayl->display) < 0) {
LOG_ERRNO("failed to dispatch pending Wayland events");
return;
}
}
wayl_flush(wayl);
}