+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.
{
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;
set_errno (ENOSYS);
paranoid_printf ("proc_subproc returned 0");
res = -1;
- goto done;
+ break;
}
if ((waitfor = w->ev) == NULL)
/* 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)
}
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",