shell: Handle the desktop shell client destroy signal
Set the internal pointer for the client to NULL. This fixes a segmentation fault at shutdown, where the shell would hang up before and cause libwayland to call wl_client_destroy(). When the shell was destroyed later, another call to wl_client_destroy() would cause the crash. https://bugs.freedesktop.org/show_bug.cgi?id=72550
This commit is contained in:
parent
18536764b4
commit
312ea4ca42
@ -5007,6 +5007,17 @@ desktop_shell_sigchld(struct weston_process *process, int status)
|
||||
shell_fade_startup(shell);
|
||||
}
|
||||
|
||||
static void
|
||||
desktop_shell_client_destroy(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct desktop_shell *shell;
|
||||
|
||||
shell = container_of(listener, struct desktop_shell,
|
||||
child.client_destroy_listener);
|
||||
|
||||
shell->child.client = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
launch_desktop_shell_process(void *data)
|
||||
{
|
||||
@ -5019,6 +5030,11 @@ launch_desktop_shell_process(void *data)
|
||||
|
||||
if (!shell->child.client)
|
||||
weston_log("not able to start %s\n", shell->client);
|
||||
|
||||
shell->child.client_destroy_listener.notify =
|
||||
desktop_shell_client_destroy;
|
||||
wl_client_add_destroy_listener(shell->child.client,
|
||||
&shell->child.client_destroy_listener);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -92,6 +92,7 @@ struct desktop_shell {
|
||||
struct weston_process process;
|
||||
struct wl_client *client;
|
||||
struct wl_resource *desktop_shell;
|
||||
struct wl_listener client_destroy_listener;
|
||||
|
||||
unsigned deathcount;
|
||||
uint32_t deathstamp;
|
||||
|
Loading…
x
Reference in New Issue
Block a user