[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] libxl: fork: Provide ..._always_selective_reap
commit 400c0aec59c55e2cfe70091a3a6db326fb41ffa1 Author: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> AuthorDate: Thu Jan 16 17:01:50 2014 +0000 Commit: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> CommitDate: Thu Feb 6 14:20:19 2014 +0000 libxl: fork: Provide ..._always_selective_reap Applications exist which want to use libxl in an event-driven mode but which do not integrate child termination into their event system, but instead reap all their own children synchronously. In such an application libxl must own SIGCHLD but avoid reaping any children that don't belong to libxl. Provide libxl_sigchld_owner_libxl_always_selective_reap which has this behaviour. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> Cc: Jim Fehlig <jfehlig@xxxxxxxx> Cc: Ian Campbell <Ian.Campbell@xxxxxxxxxx> Acked-by: Ian Campbell <Ian.Campbell@xxxxxxxxxx> --- v2: Document the new mode in the big "Subprocess handling" comment. --- tools/libxl/libxl_event.h | 11 +++++++++++ tools/libxl/libxl_fork.c | 7 +++++++ 2 files changed, 18 insertions(+), 0 deletions(-) diff --git a/tools/libxl/libxl_event.h b/tools/libxl/libxl_event.h index 3c93955..824ac88 100644 --- a/tools/libxl/libxl_event.h +++ b/tools/libxl/libxl_event.h @@ -474,6 +474,12 @@ void libxl_osevent_occurred_timeout(libxl_ctx *ctx, void *for_libxl) * and provides a callback to be notified of their exit * statues. The application must have only one libxl_ctx * configured this way. + * + * libxl_sigchld_owner_libxl_always_selective_reap: + * + * The application expects to reap all of its own children + * synchronously, and does not use SIGCHLD. libxl is + * to install a SIGCHLD handler. */ @@ -491,6 +497,11 @@ typedef enum { /* libxl owns SIGCHLD all the time, and the application is * relying on libxl's event loop for reaping its children too. */ libxl_sigchld_owner_libxl_always, + + /* libxl owns SIGCHLD all the time, but it must only reap its own + * children. The application will reap its own children + * synchronously with waitpid, without the assistance of SIGCHLD. */ + libxl_sigchld_owner_libxl_always_selective_reap, } libxl_sigchld_owner; typedef struct { diff --git a/tools/libxl/libxl_fork.c b/tools/libxl/libxl_fork.c index b2325e0..16e17f6 100644 --- a/tools/libxl/libxl_fork.c +++ b/tools/libxl/libxl_fork.c @@ -268,6 +268,7 @@ static bool chldmode_ours(libxl_ctx *ctx, bool creating) case libxl_sigchld_owner_mainloop: return 0; case libxl_sigchld_owner_libxl_always: + case libxl_sigchld_owner_libxl_always_selective_reap: return 1; } abort(); @@ -398,6 +399,12 @@ static void sigchld_selfpipe_handler(libxl__egc *egc, libxl__ev_fd *ev, int e = libxl__self_pipe_eatall(selfpipe); if (e) LIBXL__EVENT_DISASTER(egc, "read sigchld pipe", e, 0); + if (CTX->childproc_hooks->chldowner + == libxl_sigchld_owner_libxl_always_selective_reap) { + childproc_checkall(egc); + return; + } + while (chldmode_ours(CTX, 0) /* in case the app changes the mode */) { int status; pid_t pid = checked_waitpid(egc, -1, &status); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |