From: Slaven Rezic Date: Fri, 14 Feb 2003 09:11:15 +0000 (+0100) Subject: Re: [perl #20920] Segmentation fault ("Safe Signal" queue problem?) X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2fb44b4522b8956ab337b2f83a5fe619b0773788;p=p5sagit%2Fp5-mst-13.2.git Re: [perl #20920] Segmentation fault ("Safe Signal" queue problem?) Message-ID: <878ywji8nw.fsf@vran.herceg.de> (with slight tweaks) p4raw-id: //depot/perl@18765 --- diff --git a/mg.c b/mg.c index 20673bf..81e1ac6 100644 --- a/mg.c +++ b/mg.c @@ -1159,8 +1159,26 @@ Perl_despatch_signals(pTHX) PL_sig_pending = 0; for (sig = 1; sig < SIG_SIZE; sig++) { if (PL_psig_pend[sig]) { - PL_psig_pend[sig] = 0; - (*PL_sighandlerp)(sig); +#define PERL_BLOCK_SIGNALS +#if defined(HAS_SIGPROCMASK) && defined(PERL_BLOCK_SIGNALS) +# define BLOCK_SIGNALS_WITH_SIGPROCMASK +#endif +#ifdef BLOCK_SIGNALS_WITH_SIGPROCMASK + /* From sigaction(2) (FreeBSD man page): + * | Signal routines normally execute with the signal that + * | caused their invocation blocked, but other signals may + * | yet occur. + * Emulate this behavior. + */ + sigset_t set; + sigemptyset(&set); + sigaddset(&set,sig); +#endif + PL_psig_pend[sig] = 0; +#ifdef BLOCK_SIGNALS_WITH_SIGPROCMASK + sigprocmask(SIG_BLOCK, &set, NULL); +#endif + (*PL_sighandlerp)(sig); } } }