[PATCH weston 1/3] compositor: add weston_client_start()
Derek Foreman
derekf at osg.samsung.com
Wed Aug 27 09:31:18 PDT 2014
On 27/08/14 05:41 AM, Pekka Paalanen wrote:
> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>
> weston_client_start() is a new wrapper around weston_client_launch(),
> that does the process tracking on its own, and logs the process exit
> status.
>
> When users of weston_client_start() want to know when the process exits,
> they should hook into the wl_client destroy signal. This works for cases
> where the client is not expected to disconnect without exiting.
>
> As wl_client destructor and the sigchld handler run in arbitary order,
> it is usually difficult for users to maintain both struct weston_process
> and a struct wl_client pointer. You would need to wait for both
> destructor and handler to have run, before attempting to respawn the
> client.
>
> This new function relieves the caller from the burden of maintaining the
> struct weston_process, assuming the caller is only interested in client
> disconnects.
>
> Cc: Boyan Ding <stu_dby at 126.com>
> Cc: Derek Foreman <derekf at osg.samsung.com>
> Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> ---
> src/compositor.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> src/compositor.h | 3 +++
> 2 files changed, 63 insertions(+)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 96e3435..c62077c 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -319,6 +319,66 @@ weston_client_launch(struct weston_compositor *compositor,
> return client;
> }
>
> +struct process_info {
> + struct weston_process proc;
> + char *path;
> +};
> +
> +static void
> +process_handle_sigchld(struct weston_process *process, int status)
> +{
> + struct process_info *pinfo =
> + container_of(process, struct process_info, proc);
> +
> + /*
> + * There are no guarantees whether this runs before or after
> + * the wl_client destructor.
> + */
> +
> + if (WIFEXITED(status)) {
> + weston_log("%s exited with status %d\n", pinfo->path,
> + WEXITSTATUS(status));
If I might be immensely pedantic, this may in fact only indicate that
the process that was going to exec pinfo->path failed. So, the log
message may indicate that lala/foo exited with status 255 when lala/foo
was actually ENOENT.
I find that to be a little confusing, but I can get past it if nobody
else minds. :)
> + } else if (WIFSIGNALED(status)) {
> + weston_log("%s died on signal %d\n", pinfo->path,
> + WTERMSIG(status));
> + } else {
> + weston_log("%s disappeared\n", pinfo->path);
> + }
> +
> + free(pinfo->path);
> + free(pinfo);
> +}
> +
> +WL_EXPORT struct wl_client *
> +weston_client_start(struct weston_compositor *compositor, const char *path)
> +{
> + struct process_info *pinfo;
> + struct wl_client *client;
> +
> + pinfo = zalloc(sizeof *pinfo);
> + if (!pinfo)
> + return NULL;
> +
> + pinfo->path = strdup(path);
> + if (!pinfo->path)
> + goto out_free;
> +
> + client = weston_client_launch(compositor, &pinfo->proc, path,
> + process_handle_sigchld);
> + if (!client)
> + goto out_str;
> +
> + return client;
> +
> +out_str:
> + free(pinfo->path);
> +
> +out_free:
> + free(pinfo);
> +
> + return NULL;
> +}
> +
> static void
> region_init_infinite(pixman_region32_t *region)
> {
> diff --git a/src/compositor.h b/src/compositor.h
> index c0fc0a6..24a9768 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -1345,6 +1345,9 @@ weston_client_launch(struct weston_compositor *compositor,
> const char *path,
> weston_process_cleanup_func_t cleanup);
>
> +struct wl_client *
> +weston_client_start(struct weston_compositor *compositor, const char *path);
> +
> void
> weston_watch_process(struct weston_process *process);
>
>
More information about the wayland-devel
mailing list