From: Nick Ing-Simmons Date: Thu, 11 Jan 2001 20:57:44 +0000 (+0000) Subject: Catch die in %SIG handler and unblock the signal before re-dying. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=1b266415f383a85c93346bb15a7bdcac7f62eb77;p=p5sagit%2Fp5-mst-13.2.git Catch die in %SIG handler and unblock the signal before re-dying. This make Linux work _without_ sigsetjmp(). Turn off sigsetjmp() to see what else it does. May need Configure probe for sigprocmask() if anything has sigaction() but not sigprocmask(). p4raw-id: //depot/perlio@8407 --- diff --git a/mg.c b/mg.c index ca06b89..a7566e3 100644 --- a/mg.c +++ b/mg.c @@ -2161,6 +2161,8 @@ Perl_sighandler(int sig) U32 flags = 0; I32 o_save_i = PL_savestack_ix; XPV *tXpv = PL_Xpv; + sigjmp_buf jmp; + Sighandler_t handler; #if defined(WIN32) && defined(PERL_IMPLICIT_CONTEXT) PERL_SET_THX(aTHXo); /* fake TLS, see above */ @@ -2223,9 +2225,26 @@ Perl_sighandler(int sig) PUSHs(sv); PUTBACK; - call_sv((SV*)cv, G_DISCARD); + call_sv((SV*)cv, G_DISCARD|G_EVAL); POPSTACK; + if (SvTRUE(ERRSV)) { +#ifdef HAS_SIGACTION + /* Handler "died", for example to get out of a restart-able read(). + * Before we re-do that on its behalf re-enable the signal which was + * blocked by the system when we entered. + */ + sigset_t set; + sigemptyset(&set); + sigaddset(&set,sig); + sigprocmask(SIG_UNBLOCK, &set, NULL); +#else + /* Not clear if this will work */ + (void)rsignal(sig, SIG_IGN); + (void)rsignal(sig, PL_sighandlerp); +#endif + Perl_die(aTHX_ Nullch); + } cleanup: if (flags & 1) PL_savestack_ix -= 8; /* Unprotect save in progress. */ diff --git a/scope.h b/scope.h index d45bd94..0ceb6ba 100644 --- a/scope.h +++ b/scope.h @@ -36,7 +36,7 @@ #define SAVEt_PADSV 35 #ifndef SCOPE_SAVES_SIGNAL_MASK -#define SCOPE_SAVES_SIGNAL_MASK 1 +#define SCOPE_SAVES_SIGNAL_MASK 0 #endif #define SSCHECK(need) if (PL_savestack_ix + need > PL_savestack_max) savestack_grow()