[mutter/wip/carlosg/xwayland-non-fatal-io-errors: 2/2] wayland: Set IO error exit handler
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/xwayland-non-fatal-io-errors: 2/2] wayland: Set IO error exit handler
- Date: Mon, 21 Sep 2020 12:31:54 +0000 (UTC)
commit a86aaaec8bc0bb1efd40f494d166d1e73e49633b
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Jun 14 16:04:44 2019 +0200
wayland: Set IO error exit handler
If this call is available, we can turn libX11 IO errors (fatal by definition)
into something we can recover from. Try to dispose all X11 resources and close
the display instead, so the compositor can survive the event.
config.h.meson | 3 +++
meson.build | 8 ++++++++
src/wayland/meta-xwayland.c | 16 ++++++++++++++++
3 files changed, 27 insertions(+)
---
diff --git a/config.h.meson b/config.h.meson
index b2a23596f0..f4d6000e17 100644
--- a/config.h.meson
+++ b/config.h.meson
@@ -71,6 +71,9 @@
/* Whether Xwayland has -initfd option */
#mesondefine HAVE_XWAYLAND_INITFD
+/* Whether libX11 has XSetIOErrorExitHandler */
+#mesondefine HAVE_XSETIOERROREXITHANDLER
+
/* Whether the mkostemp function exists */
#mesondefine HAVE_MKOSTEMP
diff --git a/meson.build b/meson.build
index 85ac8f791a..946ffd2dab 100644
--- a/meson.build
+++ b/meson.build
@@ -421,6 +421,13 @@ if have_wayland
endif
endif
+have_xsetioerrorexithandler = false
+if cc.has_function('XSetIOErrorExitHandler', dependencies: x11_dep,
+ prefix: '''#include <X11/Xlib.h>''')
+ have_xsetioerrorexithandler = true
+ cdata.set('HAVE_XSETIOERROREXITHANDLER', 1)
+endif
+
optional_functions = [
'mkostemp',
'posix_fallocate',
@@ -492,6 +499,7 @@ output = [
' Introspection............ ' + have_introspection.to_string(),
' Profiler................. ' + have_profiler.to_string(),
' Xwayland initfd.......... ' + have_xwayland_initfd.to_string(),
+ ' Safe X11 I/O errors...... ' + have_xsetioerrorexithandler.to_string(),
'',
' Tests:',
'',
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index f2d193e95e..5b873451d8 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -334,6 +334,19 @@ x_io_error (Display *display)
return 0;
}
+#ifdef HAVE_XSETIOERROREXITHANDLER
+static void
+x_io_error_exit (Display *display)
+{
+ MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
+ MetaXWaylandManager *manager = &compositor->xwayland_manager;
+
+ g_warning ("Xwayland just died, attempting to recover");
+ manager->xserver_grace_period_id =
+ g_idle_add (shutdown_xwayland_cb, manager);
+}
+#endif
+
void
meta_xwayland_override_display_number (int number)
{
@@ -795,6 +808,9 @@ meta_xwayland_complete_init (MetaDisplay *display,
we won't reset the tty).
*/
XSetIOErrorHandler (x_io_error);
+#ifdef HAVE_XSETIOERROREXITHANDLER
+ XSetIOErrorExitHandler (x_io_error_exit);
+#endif
g_signal_connect (display, "x11-display-closing",
G_CALLBACK (on_x11_display_closing), NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]