summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorOlivier Fourdan <ofourdan@redhat.com>2020-04-24 17:45:49 +0200
committerOlivier Fourdan <fourdan@gmail.com>2020-05-29 09:24:11 +0000
commit0430d13c1ed8ddbb1d5a57d7e507771f8079d9af (patch)
tree08452921bc01629cdc780cd6ab8e7c2b832cb469 /hw
parentb8b10e29302d94832be8f0d8aa7aa1b54e42762c (diff)
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()` continuously. 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 negative. Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Reviewed-by: Roman Gilg <subdiff@gmail.com> Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com> (cherry picked from commit 785e59060c00129e47da6c0877604a56d7e0e32f)
Diffstat (limited to 'hw')
-rw-r--r--hw/xwayland/xwayland-input.c4
-rw-r--r--hw/xwayland/xwayland.c26
-rw-r--r--hw/xwayland/xwayland.h2
3 files changed, 18 insertions, 14 deletions
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index fa46ac3e7..ba2febc1d 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -2904,9 +2904,7 @@ InitInput(int argc, char *argv[])
xwl_screen->XYToWindow = pScreen->XYToWindow;
pScreen->XYToWindow = xwl_xy_to_window;
- wl_display_roundtrip(xwl_screen->display);
- while (xwl_screen->expecting_event)
- wl_display_roundtrip(xwl_screen->display);
+ xwl_screen_roundtrip(xwl_screen);
}
void
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
index ed9f2e3c2..44d1bb4da 100644
--- a/hw/xwayland/xwayland.c
+++ b/hw/xwayland/xwayland.c
@@ -1043,6 +1043,19 @@ xwl_sync_events (struct xwl_screen *xwl_screen)
xwl_read_events (xwl_screen);
}
+void
+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");
+}
+
static CARD32
add_client_fd(OsTimerPtr timer, CARD32 time, void *arg)
{
@@ -1182,14 +1195,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
xwl_screen->registry = wl_display_get_registry(xwl_screen->display);
wl_registry_add_listener(xwl_screen->registry,
&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)
- wl_display_roundtrip(xwl_screen->display);
+ xwl_screen_roundtrip(xwl_screen);
bpc = xwl_screen->depth / 3;
green_bpc = xwl_screen->depth - 2 * bpc;
@@ -1281,9 +1287,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
AddCallback(&PropertyStateCallback, xwl_property_callback, pScreen);
- wl_display_roundtrip(xwl_screen->display);
- while (xwl_screen->expecting_event)
- wl_display_roundtrip(xwl_screen->display);
+ xwl_screen_roundtrip(xwl_screen);
return ret;
}
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
index daa719209..bc5836ec4 100644
--- a/hw/xwayland/xwayland.h
+++ b/hw/xwayland/xwayland.h
@@ -381,6 +381,8 @@ void xwl_window_create_frame_callback(struct xwl_window *xwl_window);
void xwl_sync_events (struct xwl_screen *xwl_screen);
+void xwl_screen_roundtrip (struct xwl_screen *xwl_screen);
+
Bool xwl_screen_init_cursor(struct xwl_screen *xwl_screen);
struct xwl_screen *xwl_screen_get(ScreenPtr screen);