Commit 785e5906 authored by Olivier Fourdan's avatar Olivier Fourdan

xwayland: Fix infinite loop at startup

Mutter recently added headless tests, and when running those tests the
Wayland compositor runs for a very short time.

Xwayland is spawned by the Wayland compositor and upon startup will
query the various Wayland protocol supported by the compositor.

To do so, it will do a roundtrip to the Wayland server waiting for
events it expects.

If the Wayland compositor terminates before Xwayland has got the replies
it expects, it will loop indefinitely calling `wl_display_roundtrip()`

To avoid that issue, add a new `xwl_screen_roundtrip()` that checks for
the returned value from `wl_display_roundtrip()` and fails if it is
Signed-off-by: default avatarOlivier Fourdan <>
Reviewed-by: Roman Gilg's avatarRoman Gilg <>
Reviewed-by: Jonas Ådahl's avatarJonas Ådahl <>
parent 2fe13a1f
Pipeline #138048 passed with stages
in 4 minutes and 53 seconds
......@@ -2915,9 +2915,7 @@ InitInput(int argc, char *argv[])
xwl_screen->XYToWindow = pScreen->XYToWindow;
pScreen->XYToWindow = xwl_xy_to_window;
while (xwl_screen->expecting_event)
......@@ -489,6 +489,19 @@ xwl_sync_events (struct xwl_screen *xwl_screen)
xwl_read_events (xwl_screen);
xwl_screen_roundtrip(struct xwl_screen *xwl_screen)
int ret;
ret = wl_display_roundtrip(xwl_screen->display);
while (ret >= 0 && xwl_screen->expecting_event)
ret = wl_display_roundtrip(xwl_screen->display);
if (ret < 0)
xwl_give_up("could not connect to wayland server\n");
xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
......@@ -572,14 +585,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
xwl_screen->registry = wl_display_get_registry(xwl_screen->display);
&registry_listener, xwl_screen);
ret = wl_display_roundtrip(xwl_screen->display);
if (ret == -1) {
ErrorF("could not connect to wayland server\n");
return FALSE;
while (xwl_screen->expecting_event > 0)
bpc = xwl_screen->depth / 3;
green_bpc = xwl_screen->depth - 2 * bpc;
......@@ -678,9 +684,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
AddCallback(&PropertyStateCallback, xwl_property_callback, pScreen);
while (xwl_screen->expecting_event)
return ret;
......@@ -126,6 +126,7 @@ struct xwl_output *xwl_screen_get_first_output(struct xwl_screen *xwl_screen);
Bool xwl_close_screen(ScreenPtr screen);
Bool xwl_screen_init(ScreenPtr pScreen, int argc, char **argv);
void xwl_sync_events (struct xwl_screen *xwl_screen);
void xwl_screen_roundtrip (struct xwl_screen *xwl_screen);
void xwl_surface_damage(struct xwl_screen *xwl_screen,
struct wl_surface *surface,
int32_t x, int32_t y, int32_t width, int32_t height);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment