On Fri, 14 Jul 2006, Artur Bergman wrote:
> It is threadsafe in the sense you won't crash, but PL_sig_pending
> might be set to 0 by the running thread and thus not cause the
> signal to be delivered until another signal is raised.

Not true, the dispatcher checks the signals *after* resetting the
PL_sig_pending flag:

void
Perl_despatch_signals(pTHX)
{
    dVAR;
    int sig;
    PL_sig_pending = 0;
    for (sig = 1; sig < SIG_SIZE; sig++) {
        if (PL_psig_pend[sig]) {
            PERL_BLOCKSIG_ADD(set, sig);
            PL_psig_pend[sig] = 0;
            PERL_BLOCKSIG_BLOCK(set);
            (*PL_sighandlerp)(sig);
            PERL_BLOCKSIG_UNBLOCK(set);
        }
    }
}

> I don't think the fix is to add locking into the dispatcher :D

I stand by my claim that the code is safe and correct as is.

You have to try harder to come up with an example that shows how this
can fail. :)

Cheers,
-Jan

PS: See also here for the discussion about exactly the same topic in
May:

http://www.nntp.perl.org/group/perl.perl5.porters/;msgid=20060509232219.
GT2831%5Bat%5Diabyn.com?show_headers=1


Reply via email to