mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
wayland: roundtrip: log error and abort when wl_display_roundtrip() fails
ayl_roundtrip() has the following code:
wl_display_roundtrip(wayl->display);
while (wl_display_prepare_read(wayl->display) != 0)
wl_display_dispatch_pending(wayl->display);
wayl_flush(wayl);
If the first wl_display_roundtrip() fails, for example because the
Wayland socket has been closed, we may get stuck in the while-loop.
This happens if the read queue isn’t empty, in which case
wl_display_prepare_read() will return -1 and we’ll continue trying to
dispatch the pending events forever, never succeeding since the socket
is gone.
Closes #542
This commit is contained in:
parent
361fb74a8f
commit
7bdecaae3b
2 changed files with 13 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
13
wayland.c
13
wayland.c
|
|
@ -1589,14 +1589,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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue