Re: [perl #20920] Segmentation fault ("Safe Signal" queue problem?)
Slaven Rezic [Fri, 14 Feb 2003 09:11:15 +0000 (10:11 +0100)]
Message-ID: <878ywji8nw.fsf@vran.herceg.de>

(with slight tweaks)

p4raw-id: //depot/perl@18765

mg.c

diff --git a/mg.c b/mg.c
index 20673bf..81e1ac6 100644 (file)
--- 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);
        }
     }
 }