|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl: introduce asynchronous execution API
On 25/04/14 07:26, Yang Hongyang wrote:
> 1.introduce asynchronous execution API:
> libxl__async_exec_init
> libxl__async_exec_start
> libxl__async_exec_inuse
> 2.use the async exec API to execute device hotplug scripts
Thanks, the patch looks fine to me, just a couple of comments on style
nits (but it can be applied as-is).
Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>
> Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxx>
> Signed-off-by: Wen Congyang <wency@xxxxxxxxxxxxxx>
> Signed-off-by: Yang Hongyang <yanghy@xxxxxxxxxxxxxx>
> ---
> tools/libxl/libxl_aoutils.c | 89
> ++++++++++++++++++++++++++++++++++++++++++++
> tools/libxl/libxl_device.c | 78 +++++++++++---------------------------
> tools/libxl/libxl_internal.h | 32 ++++++++++++++--
> 3 files changed, 139 insertions(+), 60 deletions(-)
>
> diff --git a/tools/libxl/libxl_aoutils.c b/tools/libxl/libxl_aoutils.c
> index 1c9eb9e..6215a3d 100644
> --- a/tools/libxl/libxl_aoutils.c
> +++ b/tools/libxl/libxl_aoutils.c
> @@ -451,3 +451,92 @@ int libxl__openptys(libxl__openpty_state *op,
> return rc;
> }
>
> +static void async_exec_timeout(libxl__egc *egc,
> + libxl__ev_time *ev,
> + const struct timeval *requested_abs)
> +{
> + libxl__async_exec_state *aes = CONTAINER_OF(ev, *aes, time);
> + STATE_AO_GC(aes->ao);
> +
> + libxl__ev_time_deregister(gc, &aes->time);
> +
> + assert(libxl__ev_child_inuse(&aes->child));
> + LOG(DEBUG, "killing execution of %s because of timeout", aes->what);
I would make the message above an ERROR, rather than DEBUG (I know it's
a DEBUG message right now, but I think the message is relevant enough to
be printed as an error).
> +
> + if (kill(aes->child.pid, SIGKILL)) {
> + LOGEV(ERROR, errno, "unable to kill %s [%ld]",
> + aes->what, (unsigned long)aes->child.pid);
> + }
> +
> + return;
> +}
> +
> +static void async_exec_done(libxl__egc *egc,
> + libxl__ev_child *child,
> + pid_t pid, int status)
> +{
> + libxl__async_exec_state *aes = CONTAINER_OF(child, *aes, child);
> + STATE_AO_GC(aes->ao);
> +
> + libxl__ev_time_deregister(gc, &aes->time);
> +
> + if (status) {
> + libxl_report_child_exitstatus(CTX, LIBXL__LOG_ERROR,
> + aes->what, pid, status);
> + }
> +
> + aes->callback(egc, aes, status);
> +}
> +
> +void libxl__async_exec_init(libxl__async_exec_state *aes)
> +{
> + libxl__ev_time_init(&aes->time);
> + libxl__ev_child_init(&aes->child);
> +}
> +
> +int libxl__async_exec_start(libxl__gc *gc, libxl__async_exec_state *aes)
> +{
> + pid_t pid;
> +
> + /* Convenience aliases */
> + libxl__ev_child *const child = &aes->child;
> + char ** const args = aes->args;
> +
> + /* Set execution timeout */
> + if (libxl__ev_time_register_rel(gc, &aes->time,
> + async_exec_timeout,
> + aes->timeout_ms)) {
> + LOG(ERROR, "unable to register timeout for executing: %s",
> aes->what);
> + goto errout;
> + }
> +
> + LOG(DEBUG, "asynchronously execute: %s ", aes->what);
> +
> + /* Fork and exec */
> + pid = libxl__ev_child_fork(gc, child, async_exec_done);
> + if (pid == -1) {
> + LOG(ERROR, "unable to fork");
> + goto errout;
> + }
> +
> + if (!pid) {
> + /* child */
> + libxl__exec(gc, aes->stdfds[0], aes->stdfds[1],
> + aes->stdfds[2], args[0], args, aes->env);
> + /* notreached */
> + abort();
> + }
> +
> + return 0;
> +
> +errout:
Those kind of labels are usually just called "error" inside of libxl.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |