[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 07/12] libxl: fork: Provide ..._always_selective_reap
Ian Jackson wrote: > 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(+) > > 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, > ACK to the doc improvements here. Much clearer IMO. Regards, Jim > } 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); > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |