Cleanup functions of weston clients are never called after wl_display_run(), so that some of process_info of clients will not be freed.
Signed-off-by: Ryo Munakata <ryomnk...@gmail.com> --- src/compositor.c | 24 +++++++++++++++++++++--- src/compositor.h | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index 7085053..e4b5f5a 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -303,8 +303,8 @@ child_client_exec(int sockfd, const char *path) path); } -WL_EXPORT struct wl_client * -weston_client_launch(struct weston_compositor *compositor, +static struct wl_client * +weston_client_launch_impl(struct weston_compositor *compositor, struct weston_process *proc, const char *path, weston_process_cleanup_func_t cleanup) @@ -354,6 +354,16 @@ weston_client_launch(struct weston_compositor *compositor, return client; } +WL_EXPORT struct wl_client * +weston_client_launch(struct weston_compositor *compositor, + struct weston_process *proc, + const char *path, + weston_process_cleanup_func_t cleanup) +{ + proc->managed = false; + return weston_client_launch_impl(compositor, proc, path, cleanup); +} + struct process_info { struct weston_process proc; char *path; @@ -398,7 +408,8 @@ weston_client_start(struct weston_compositor *compositor, const char *path) if (!pinfo->path) goto out_free; - client = weston_client_launch(compositor, &pinfo->proc, path, + pinfo->proc.managed = true; + client = weston_client_launch_impl(compositor, &pinfo->proc, path, process_handle_sigchld); if (!client) goto out_str; @@ -4841,6 +4852,7 @@ int main(int argc, char *argv[]) struct wl_client *primary_client; struct wl_listener primary_client_destroyed; struct weston_seat *seat; + struct weston_process *p, *p_next; const struct weston_option core_options[] = { { WESTON_OPTION_STRING, "backend", 'B', &backend }, @@ -5012,6 +5024,12 @@ out: /* prevent further rendering while shutting down */ ec->state = WESTON_COMPOSITOR_OFFSCREEN; + wl_list_for_each_safe(p, p_next, &child_process_list, link) { + wl_list_remove(&p->link); + if (p->managed) + p->cleanup(p, 0); + } + wl_signal_emit(&ec->destroy_signal, ec); weston_compositor_xkb_destroy(ec); diff --git a/src/compositor.h b/src/compositor.h index 47b6036..f1b630f 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1398,6 +1398,7 @@ struct weston_process { pid_t pid; weston_process_cleanup_func_t cleanup; struct wl_list link; + bool managed; }; struct wl_client * -- 2.3.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel