summaryrefslogtreecommitdiff
path: root/mg.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2003-02-25 06:01:09 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2003-02-25 06:01:09 +0000
commit25da442874cf6136cfd7e0a24430b1ec13c17197 (patch)
treeacc13670ec6ca4fc6e5a6dbd33d1b2e94f6d7191 /mg.c
parentf520334376d9e9412c8646c5a0407ff3708c2bec (diff)
downloadperl-25da442874cf6136cfd7e0a24430b1ec13c17197.tar.gz
A new try at #18765 (for [perl #20920]).
p4raw-id: //depot/perl@18770
Diffstat (limited to 'mg.c')
-rw-r--r--mg.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/mg.c b/mg.c
index da5666ccb6..116a369986 100644
--- a/mg.c
+++ b/mg.c
@@ -1158,8 +1158,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;
+#define PERL_BLOCK_SIGNALS
+#if defined(HAS_SIGPROCMASK) && defined(PERL_BLOCK_SIGNALS)
+ /* 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.
+ */
+# define PERL_BLOCKSIG_ADD(set,sig) \
+ sigset_t set; sigemptyset(&(set)); sigaddset(&(set), sig)
+# define PERL_BLOCKSIG_BLOCK(set) \
+ sigprocmask(SIG_BLOCK, &(set), NULL)
+# define PERL_BLOCKSIG_UNBLOCK(set) \
+ sigprocmask(SIG_UNBLOCK, &(set), NULL)
+#endif /* HAS_SIGPROCMASK && PERL_BLOCK_SIGNALS */
+ PERL_BLOCKSIG_ADD(set, sig);
+ PL_psig_pend[sig] = 0;
+ PERL_BLOCKSIG_BLOCK(set);
(*PL_sighandlerp)(sig);
+ PERL_BLOCKSIG_UNBLOCK(set);
}
}
}