diff options
author | Jarkko Hietaniemi <jhi@iki.fi> | 2003-02-25 06:01:09 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2003-02-25 06:01:09 +0000 |
commit | 25da442874cf6136cfd7e0a24430b1ec13c17197 (patch) | |
tree | acc13670ec6ca4fc6e5a6dbd33d1b2e94f6d7191 /mg.c | |
parent | f520334376d9e9412c8646c5a0407ff3708c2bec (diff) | |
download | perl-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.c | 20 |
1 files changed, 19 insertions, 1 deletions
@@ -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); } } } |