From: Bruno Haible Date: Tue, 10 Jun 2008 11:55:34 +0000 (+0200) Subject: Try to fix waitid() based code. X-Git-Tag: v0.1~7277 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=06a29060a727dc9bfde915d057fd196a7722648f;p=gnulib.git Try to fix waitid() based code. --- diff --git a/ChangeLog b/ChangeLog index 97aec20e8..585e59ee6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2008-06-10 Bruno Haible + * lib/wait-process.c (wait_subprocess): Try to fix waitid() based code. + +2008-06-10 Bruno Haible + * tests/test-memmem.c (main): Reset SIGALRM to default handling before using alarm(). * tests/test-strcasestr.c (main): Likewise. diff --git a/lib/wait-process.c b/lib/wait-process.c index 97bc57fe5..e3086b428 100644 --- a/lib/wait-process.c +++ b/lib/wait-process.c @@ -253,9 +253,9 @@ wait_subprocess (pid_t child, const char *progname, bool slave_process, bool exit_on_error) { #if HAVE_WAITID && defined WNOWAIT && 0 - /* Commented out because waitid() with WNOWAIT doesn't work: On Solaris 7 - and OSF/1 4.0, it returns -1 and sets errno = ECHILD, and on HP-UX 10.20 - it just hangs. */ + /* Commented out because waitid() without WEXITED and with WNOWAIT doesn't + work: On Solaris 7 and OSF/1 4.0, it returns -1 and sets errno = ECHILD, + and on HP-UX 10.20 it just hangs. */ /* Use of waitid() with WNOWAIT avoids a race condition: If slave_process is true, and this process sleeps a very long time between the return from waitpid() and the execution of unregister_slave_subprocess(), and @@ -265,7 +265,8 @@ wait_subprocess (pid_t child, const char *progname, siginfo_t info; for (;;) { - if (waitid (P_PID, child, &info, slave_process ? WNOWAIT : 0) < 0) + if (waitid (P_PID, child, &info, WEXITED | (slave_process ? WNOWAIT : 0)) + < 0) { # ifdef EINTR if (errno == EINTR) @@ -297,7 +298,7 @@ wait_subprocess (pid_t child, const char *progname, /* Now remove the zombie from the process list. */ for (;;) { - if (waitid (P_PID, child, &info, 0) < 0) + if (waitid (P_PID, child, &info, WEXITED) < 0) { # ifdef EINTR if (errno == EINTR)