From: Nick Ing-Simmons Date: Wed, 9 May 2001 11:59:50 +0000 (+0000) Subject: If wait() or waitpid() ends due to EINTR despatch perl interrupt handler X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0a0ada86d5873275d2ecec5cb3ffc5cb284ca30d;p=p5sagit%2Fp5-mst-13.2.git If wait() or waitpid() ends due to EINTR despatch perl interrupt handler and re-try. Fixes "perl 5.7.x prefers suicide over killing more than one child." p4raw-id: //depot/perlio@10048 --- diff --git a/pp_sys.c b/pp_sys.c index 5505e33..826a588 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -3902,7 +3902,13 @@ PP(pp_wait) Pid_t childpid; int argflags; +#ifdef PERL_OLD_SIGNALS childpid = wait4pid(-1, &argflags, 0); +#else + while ((childpid = wait4pid(-1, &argflags, 0)) == -1 && errno == EINTR) { + PERL_ASYNC_CHECK(); + } +#endif # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS) /* 0 and -1 are both error returns (the former applies to WNOHANG case) */ STATUS_NATIVE_SET((childpid && childpid != -1) ? argflags : -1); @@ -3926,7 +3932,13 @@ PP(pp_waitpid) optype = POPi; childpid = TOPi; +#ifdef PERL_OLD_SIGNALS childpid = wait4pid(childpid, &argflags, optype); +#else + while ((childpid = wait4pid(childpid, &argflags, optype)) == -1 && errno == EINTR) { + PERL_ASYNC_CHECK(); + } +#endif # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS) /* 0 and -1 are both error returns (the former applies to WNOHANG case) */ STATUS_NATIVE_SET((childpid && childpid != -1) ? argflags : -1);