changeset 10193:b67d0f4f1513

Try to fix waitid() based code.
author Bruno Haible <bruno@clisp.org>
date Tue, 10 Jun 2008 13:55:34 +0200
parents 0553e4d56bcc
children 8297e6235e2d
files ChangeLog lib/wait-process.c
diffstat 2 files changed, 10 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Jun 10 12:13:43 2008 +0200
+++ b/ChangeLog	Tue Jun 10 13:55:34 2008 +0200
@@ -1,3 +1,7 @@
+2008-06-10  Bruno Haible  <bruno@clisp.org>
+
+	* lib/wait-process.c (wait_subprocess): Try to fix waitid() based code.
+
 2008-06-10  Bruno Haible  <bruno@clisp.org>
 
 	* tests/test-memmem.c (main): Reset SIGALRM to default handling before
--- a/lib/wait-process.c	Tue Jun 10 12:13:43 2008 +0200
+++ b/lib/wait-process.c	Tue Jun 10 13:55:34 2008 +0200
@@ -253,9 +253,9 @@
 		 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 @@
   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 @@
       /* 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)