Skip to content

Commit

Permalink
Integrate change #16844 from maint:
Browse files Browse the repository at this point in the history
extension of change#16332: isolate signal diddling to the main
interpreter (fixes signal-related races, e.g. when multiple
threads run system())
p4raw-link: @16844 on //depot/maint-5.6/perl: 9bc2ac2
p4raw-link: @16332 on //depot/maint-5.6/perl: 9bf7742

p4raw-id: //depot/perl@17569
p4raw-integrated: from //depot/maint-5.6/perl@17567 'merge in' util.c
	(@16508..)
  • Loading branch information
jhi committed Jul 16, 2002
1 parent 1095be3 commit a10b1e1
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -2349,6 +2349,12 @@ Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
{
struct sigaction act, oact;

#ifdef USE_ITHREADS
/* only "parent" interpreter can diddle signals */
if (PL_curinterp != aTHX)
return SIG_ERR;
#endif

act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
Expand Down Expand Up @@ -2383,6 +2389,12 @@ Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
{
struct sigaction act;

#ifdef USE_ITHREADS
/* only "parent" interpreter can diddle signals */
if (PL_curinterp != aTHX)
return -1;
#endif

act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
Expand All @@ -2401,6 +2413,12 @@ Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
int
Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
{
#ifdef USE_ITHREADS
/* only "parent" interpreter can diddle signals */
if (PL_curinterp != aTHX)
return -1;
#endif

return sigaction(signo, save, (struct sigaction *)NULL);
}

Expand All @@ -2409,6 +2427,12 @@ Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
Sighandler_t
Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
{
#ifdef USE_ITHREADS
/* only "parent" interpreter can diddle signals */
if (PL_curinterp != aTHX)
return SIG_ERR;
#endif

return PerlProc_signal(signo, handler);
}

Expand All @@ -2427,6 +2451,12 @@ Perl_rsignal_state(pTHX_ int signo)
{
Sighandler_t oldsig;

#ifdef USE_ITHREADS
/* only "parent" interpreter can diddle signals */
if (PL_curinterp != aTHX)
return SIG_ERR;
#endif

sig_trapped = 0;
oldsig = PerlProc_signal(signo, sig_trap);
PerlProc_signal(signo, oldsig);
Expand All @@ -2438,13 +2468,23 @@ Perl_rsignal_state(pTHX_ int signo)
int
Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
{
#ifdef USE_ITHREADS
/* only "parent" interpreter can diddle signals */
if (PL_curinterp != aTHX)
return -1;
#endif
*save = PerlProc_signal(signo, handler);
return (*save == SIG_ERR) ? -1 : 0;
}

int
Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
{
#ifdef USE_ITHREADS
/* only "parent" interpreter can diddle signals */
if (PL_curinterp != aTHX)
return -1;
#endif
return (PerlProc_signal(signo, *save) == SIG_ERR) ? -1 : 0;
}

Expand Down

0 comments on commit a10b1e1

Please sign in to comment.