[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/7] introduce an API to async exec scripts
Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxx> Signed-off-by: Wen Congyang <wency@xxxxxxxxxxxxxx> --- tools/libxl/libxl_internal.c | 79 ++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_internal.h | 17 +++++++++ 2 files changed, 96 insertions(+), 0 deletions(-) diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index 6c94d3e..4c9c23b 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -375,6 +375,85 @@ out: return rc; } +static void libxl_async_exec_timeout(libxl__egc *egc, + libxl__ev_time *ev, + const struct timeval *requested_abs) +{ + libxl_async_exec *async_exec = CONTAINER_OF(ev, *async_exec, time); + + STATE_AO_GC(async_exec->ao); + + libxl__ev_time_deregister(gc, &async_exec->time); + assert(libxl__ev_child_inuse(&async_exec->child)); + + LOG(DEBUG, "killing hotplug script %s because of timeout", + async_exec->args[0]); + + if (kill(async_exec->child.pid, SIGKILL)) { + LOGEV(ERROR, errno, "unable to kill hotplug script %s [%ld]", + async_exec->args[0], + (unsigned long)async_exec->child.pid); + } + + return; +} + +static void libxl_async_exec_done(libxl__egc *egc, + libxl__ev_child *child, + pid_t pid, int status) +{ + libxl_async_exec *async_exec = CONTAINER_OF(child, *async_exec, child); + + STATE_AO_GC(async_exec->ao); + + libxl__ev_time_deregister(gc, &async_exec->time); + + if (status && !async_exec->allow_fail) { + libxl_report_child_exitstatus(CTX, LIBXL__LOG_ERROR, + async_exec->args[0], + pid, status); + } + + async_exec->finish_cb(async_exec->opaque, status); +} + +int libxl_async_exec_script(libxl__gc *gc, libxl_async_exec *async_exec) +{ + pid_t pid; + + /* Convenience aliases */ + libxl__ev_child *const child = &async_exec->child; + char * const *args = async_exec->args; + char * const *env = async_exec->env; + + /* Set hotplug timeout */ + if (libxl__ev_time_register_rel(gc, &async_exec->time, + libxl_async_exec_timeout, + async_exec->timeout * 1000)) { + LOG(ERROR, "unable to register timeout for " + "script %s", args[0]); + return ERROR_FAIL; + } + + LOG(DEBUG, "Calling script: %s ", args[0]); + + /* Fork and exec netbuf script */ + pid = libxl__ev_child_fork(gc, child, libxl_async_exec_done); + if (pid == -1) { + LOG(ERROR, "unable to fork for script %s", args[0]); + return ERROR_FAIL; + } + + if (!pid) { + /* child: Launch netbuf script */ + libxl__exec(gc, -1, -1, -1, args[0], args, env); + /* notreached */ + abort(); + } + + return 0; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index dc49f16..ab82334 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3133,6 +3133,23 @@ void libxl__numa_candidate_put_nodemap(libxl__gc *gc, */ #define CTYPE(isfoo,c) (isfoo((unsigned char)(c))) +typedef struct libxl_async_exec { + char * *env; + char * *args; + void *opaque; + void (*finish_cb)(void *opaque, int status); + /* unit: second */ + int timeout; + bool allow_fail; + + libxl__ev_time time; + libxl__ev_child child; + libxl__ao *ao; +} libxl_async_exec; + +_hidden extern int libxl_async_exec_script(libxl__gc *gc, + libxl_async_exec *async_exec); + #endif -- 1.7.4.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |