[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/7] libxl: fork: Break out checked_waitpid
On Thu, 2014-01-16 at 17:22 +0000, Ian Jackson wrote: > This is a simple error-handling wrapper for waitpid. We're going to > want to call waitpid somewhere else and this avoids some of the > duplication. > > No functional change in this patch. (Technically, we used to check > chldmode_ours again in the EINTR case, and don't now, but that can't > have changed because we continuously hold the libxl ctx lock.) I was going to ask if that outer while condition is a bit pointless then, but I see that outside the context we drop and reacquire the lock so it makes sense. > 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> > --- > tools/libxl/libxl_fork.c | 26 ++++++++++++++++++-------- > 1 file changed, 18 insertions(+), 8 deletions(-) > > diff --git a/tools/libxl/libxl_fork.c b/tools/libxl/libxl_fork.c > index 4ae9f94..2252370 100644 > --- a/tools/libxl/libxl_fork.c > +++ b/tools/libxl/libxl_fork.c > @@ -155,6 +155,22 @@ int libxl__carefd_fd(const libxl__carefd *cf) > * Actual child process handling > */ > > +/* Like waitpid(,,WNOHANG) but handles all errors except ECHILD. */ > +static pid_t checked_waitpid(libxl__egc *egc, pid_t want, int *status) > +{ > + for (;;) { > + pid_t got = waitpid(want, status, WNOHANG); > + if (got != -1) > + return got; > + if (errno == ECHILD) > + return got; > + if (errno == EINTR) > + continue; > + LIBXL__EVENT_DISASTER(egc, "waitpid() failed", errno, 0); > + return 0; > + } > +} > + > static void sigchld_selfpipe_handler(libxl__egc *egc, libxl__ev_fd *ev, > int fd, short events, short revents); > > @@ -331,16 +347,10 @@ static void sigchld_selfpipe_handler(libxl__egc *egc, > libxl__ev_fd *ev, > > while (chldmode_ours(CTX, 0) /* in case the app changes the mode */) { > int status; > - pid_t pid = waitpid(-1, &status, WNOHANG); > - > - if (pid == 0) return; > + pid_t pid = checked_waitpid(egc, -1, &status); > > - if (pid == -1) { > - if (errno == ECHILD) return; > - if (errno == EINTR) continue; > - LIBXL__EVENT_DISASTER(egc, "waitpid() failed", errno, 0); > + if (pid == 0 || pid == -1 /* ECHILD */) > return; > - } > > int rc = childproc_reaped(egc, pid, status); > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |