OSDN Git Service

* wait.cc (wait4): Initialize pointer on entry. Avoid calling
authorcgf <cgf>
Fri, 12 Mar 2004 22:03:33 +0000 (22:03 +0000)
committercgf <cgf>
Fri, 12 Mar 2004 22:03:33 +0000 (22:03 +0000)
call_signal_handler twice since that guarantees exiting with errno set to
EINTR.

winsup/cygwin/ChangeLog
winsup/cygwin/wait.cc

index 26d52d6..264acd5 100644 (file)
@@ -1,3 +1,9 @@
+2004-03-12  Christopher Faylor  <cgf@redhat.com>
+
+       * wait.cc (wait4): Initialize pointer on entry.  Avoid calling
+       call_signal_handler twice since that guarantees exiting with errno set
+       to EINTR.
+
 2004-03-12  Corinna Vinschen  <corinna@vinschen.de>
 
        * exceptions.cc (sigpacket::process): Simplify code slightly.
index fda951e..4fa53ba 100644 (file)
@@ -48,25 +48,23 @@ wait4 (int intpid, int *status, int options, struct rusage *r)
 {
   int res;
   HANDLE waitfor;
-  waitq *w;
+  waitq *w = &_my_tls.wq;
 
   pthread_testcancel ();
 
   while (1)
     {
       sig_dispatch_pending ();
-      bool sawsig = false;
       if (options & ~(WNOHANG | WUNTRACED))
        {
          set_errno (EINVAL);
-         return -1;
+         res = -1;
+         break;
        }
 
       if (r)
        memset (r, 0, sizeof (*r));
 
-      w = &_my_tls.wq;
-
       w->pid = intpid;
       w->options = options;
       w->rusage = r;
@@ -77,7 +75,7 @@ wait4 (int intpid, int *status, int options, struct rusage *r)
          set_errno (ENOSYS);
          paranoid_printf ("proc_subproc returned 0");
          res = -1;
-         goto done;
+         break;
        }
 
       if ((waitfor = w->ev) == NULL)
@@ -93,14 +91,14 @@ wait4 (int intpid, int *status, int options, struct rusage *r)
          /* found no children */
          set_errno (ECHILD);
          res = -1;
-         goto done;
+         break;
        }
 
       if (w->status == -1)
        {
+         if (_my_tls.call_signal_handler ())
+           continue;
          set_sig_errno (EINTR);
-         _my_tls.call_signal_handler ();
-         sawsig = true;
          res = -1;
        }
       else if (res != WAIT_OBJECT_0)
@@ -112,10 +110,7 @@ wait4 (int intpid, int *status, int options, struct rusage *r)
        }
       else if ((res = w->pid) != 0 && status)
        *status = w->status;
-
-    done:
-      if (!sawsig || !_my_tls.call_signal_handler ())
-       break;
+      break;
     }
 
   sigproc_printf ("intpid %d, status %p, w->status %d, options %d, res %d",