[PATCH v2] text: Respawn input method process if it exits

Eduardo Lima (Etrunko) eduardo.lima at linux.intel.com
Tue May 14 09:09:31 PDT 2013


From: "Eduardo Lima (Etrunko)" <eduardo.lima at intel.com>

Just the same as it is done in shell.c, if the input method process exits
for any reason, we relaunch it automatically, as it is not possible to
launch a standalone application outside of the weston process.

In v2:
 - Proper error message when giving up.

Signed-off-by: Eduardo Lima (Etrunko) <eduardo.lima at intel.com>
---
 src/text-backend.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/text-backend.c b/src/text-backend.c
index d7ce31c..5be4a67 100644
--- a/src/text-backend.c
+++ b/src/text-backend.c
@@ -23,6 +23,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 
 #include "compositor.h"
 #include "text-server-protocol.h"
@@ -91,6 +92,9 @@ struct text_backend {
 		struct wl_resource *binding;
 		struct weston_process process;
 		struct wl_client *client;
+
+		unsigned deathcount;
+		uint32_t deathstamp;
 	} input_method;
 
 	struct wl_listener seat_created_listener;
@@ -819,14 +823,33 @@ input_method_init_seat(struct weston_seat *seat)
 	seat->input_method->focus_listener_initialized = 1;
 }
 
+static void launch_input_method(struct text_backend *text_backend);
+
 static void
 handle_input_method_sigchld(struct weston_process *process, int status)
 {
+	uint32_t time;
 	struct text_backend *text_backend =
 		container_of(process, struct text_backend, input_method.process);
 
 	text_backend->input_method.process.pid = 0;
 	text_backend->input_method.client = NULL;
+
+	/* if input_method dies more than 5 times in 10 seconds, give up */
+	time = weston_compositor_get_time();
+	if (time - text_backend->input_method.deathstamp > 10000) {
+		text_backend->input_method.deathstamp = time;
+		text_backend->input_method.deathcount = 0;
+	}
+
+	text_backend->input_method.deathcount++;
+	if (text_backend->input_method.deathcount > 5) {
+		weston_log("input_method died, giving up.\n");
+		return;
+	}
+
+	weston_log("input_method died, respawning...\n");
+	launch_input_method(text_backend);
 }
 
 static void
-- 
1.8.1.4



More information about the wayland-devel mailing list