shell: respawn desktop-shell if it dies
authorPekka Paalanen <ppaalanen@gmail.com>
Tue, 17 Jan 2012 12:36:27 +0000 (14:36 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 17 Jan 2012 15:58:52 +0000 (10:58 -0500)
If the desktop-shell client goes away for any reason, respawn it. To
avoid harmful looping, limit the respawning to 5 times within 30
seconds, and then give up.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
src/shell.c

index 9386d1e..c0d8b8d 100644 (file)
@@ -45,6 +45,9 @@ struct wl_shell {
                struct weston_process process;
                struct wl_client *client;
                struct wl_resource *desktop_shell;
+
+               unsigned deathcount;
+               uint32_t deathstamp;
        } child;
 
        bool locked;
@@ -1264,14 +1267,34 @@ configure(struct weston_shell *base, struct weston_surface *surface,
        }
 }
 
+static int launch_desktop_shell_process(struct wl_shell *shell);
+
 static void
 desktop_shell_sigchld(struct weston_process *process, int status)
 {
+       uint32_t time;
        struct wl_shell *shell =
                container_of(process, struct wl_shell, child.process);
 
        shell->child.process.pid = 0;
        shell->child.client = NULL; /* already destroyed by wayland */
+
+       /* if desktop-shell dies more than 5 times in 30 seconds, give up */
+       time = weston_compositor_get_time();
+       if (shell->child.deathstamp == 0 ||
+           time - shell->child.deathstamp > 30000) {
+               shell->child.deathstamp = time;
+               shell->child.deathcount = 0;
+       }
+
+       shell->child.deathcount++;
+       if (shell->child.deathcount > 5) {
+               fprintf(stderr, "weston-desktop-shell died, giving up.\n");
+               return;
+       }
+
+       fprintf(stderr, "weston-desktop-shell died, respawning...\n");
+       launch_desktop_shell_process(shell);
 }
 
 static int