[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 01/18] libxl: fork: Break out checked_waitpid
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.) 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); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |