From: Pekka Paalanen Date: Tue, 17 Jan 2012 12:36:27 +0000 (+0200) Subject: shell: respawn desktop-shell if it dies X-Git-Tag: 0.85.0~56 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4d733ee246798a838e4fa625b355fd058eddf3dc;p=profile%2Fivi%2Fweston.git shell: respawn desktop-shell if it dies 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 --- diff --git a/src/shell.c b/src/shell.c index 9386d1e..c0d8b8d 100644 --- a/src/shell.c +++ b/src/shell.c @@ -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