xwayland: Don't abort if Xwayland crashes

Right now if Xwayland crashes, we crash, too.

On some level that makes sense, since we're supposed to control the
lifecycle of Xwayland, and by it crashing we've lost that control.

But practically speaking, the knock-on crash adds noise to the logs,
bug trackers, and retrace servers that only makes debugging harder.
And the crash isn't something mutter can "fix", since it's
ultimately from a bug in Xwayland anyway.

This commit makes mutter exit instead of crash if Xwayland goes away
unexpectedly.


(cherry picked from commit 2d80fd02e7)
This commit is contained in:
Ray Strode 2018-04-12 14:06:01 -04:00 committed by Marco Trevisan
parent 99d766c044
commit 25c7e52ada

View File

@ -26,6 +26,8 @@
#include "meta-xwayland.h" #include "meta-xwayland.h"
#include "meta-xwayland-private.h" #include "meta-xwayland-private.h"
#include <meta/main.h>
#include <glib.h> #include <glib.h>
#include <glib-unix.h> #include <glib-unix.h>
#include <errno.h> #include <errno.h>
@ -397,25 +399,30 @@ xserver_died (GObject *source,
if (!g_subprocess_wait_finish (proc, result, &error)) if (!g_subprocess_wait_finish (proc, result, &error))
{ {
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_error ("Failed to finish waiting for Xwayland: %s", error->message); return;
g_warning ("Failed to finish waiting for Xwayland: %s", error->message);
} }
else if (!g_subprocess_get_successful (proc)) else if (!g_subprocess_get_successful (proc))
g_error ("X Wayland crashed; aborting"); g_warning ("X Wayland crashed; exiting");
else else
{ {
/* For now we simply abort if we see the server exit. /* For now we simply abort if we see the server exit.
* *
* In the future X will only be loaded lazily for legacy X support * In the future X will only be loaded lazily for legacy X support
* but for now it's a hard requirement. */ * but for now it's a hard requirement. */
g_error ("Spurious exit of X Wayland server"); g_warning ("Spurious exit of X Wayland server");
} }
meta_exit (META_EXIT_ERROR);
} }
static int static int
x_io_error (Display *display) x_io_error (Display *display)
{ {
g_error ("Connection to xwayland lost"); g_warning ("Connection to xwayland lost");
meta_exit (META_EXIT_ERROR);
return 0; return 0;
} }