From e76bddabb70fad22097056a7f3e11571929e79ef Mon Sep 17 00:00:00 2001 From: cgf Date: Fri, 12 Mar 2004 22:03:33 +0000 Subject: [PATCH] * wait.cc (wait4): Initialize pointer on entry. Avoid calling call_signal_handler twice since that guarantees exiting with errno set to EINTR. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/wait.cc | 21 ++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 26d52d64f1..264acd5991 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2004-03-12 Christopher Faylor + + * 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 * exceptions.cc (sigpacket::process): Simplify code slightly. diff --git a/winsup/cygwin/wait.cc b/winsup/cygwin/wait.cc index fda951ead1..4fa53bac62 100644 --- a/winsup/cygwin/wait.cc +++ b/winsup/cygwin/wait.cc @@ -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", -- 2.11.0