text: Respawn input method process if it exits
authorEduardo Lima (Etrunko) <eduardo.lima@intel.com>
Tue, 14 May 2013 16:09:31 +0000 (13:09 -0300)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 14 May 2013 18:55:39 +0000 (14:55 -0400)
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@intel.com>
src/text-backend.c

index da62fd7..3d1670b 100644 (file)
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <time.h>
 
 #include "compositor.h"
 #include "text-server-protocol.h"
@@ -92,6 +93,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;
@@ -820,14 +824,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