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 <ppaalanen@gmail.com>
This commit is contained in:
committed by
Kristian Høgsberg
parent
39d908e63a
commit
4d733ee246
+23
@@ -45,6 +45,9 @@ struct wl_shell {
|
|||||||
struct weston_process process;
|
struct weston_process process;
|
||||||
struct wl_client *client;
|
struct wl_client *client;
|
||||||
struct wl_resource *desktop_shell;
|
struct wl_resource *desktop_shell;
|
||||||
|
|
||||||
|
unsigned deathcount;
|
||||||
|
uint32_t deathstamp;
|
||||||
} child;
|
} child;
|
||||||
|
|
||||||
bool locked;
|
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
|
static void
|
||||||
desktop_shell_sigchld(struct weston_process *process, int status)
|
desktop_shell_sigchld(struct weston_process *process, int status)
|
||||||
{
|
{
|
||||||
|
uint32_t time;
|
||||||
struct wl_shell *shell =
|
struct wl_shell *shell =
|
||||||
container_of(process, struct wl_shell, child.process);
|
container_of(process, struct wl_shell, child.process);
|
||||||
|
|
||||||
shell->child.process.pid = 0;
|
shell->child.process.pid = 0;
|
||||||
shell->child.client = NULL; /* already destroyed by wayland */
|
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
|
static int
|
||||||
|
|||||||
Reference in New Issue
Block a user