> +Signal dispatch has been moved from the runloop into control ops. This should
> +give a few percent speed increase, and eliminates almost all of the speed
> +penalty caused by the introduction of "safe signals" in 5.8.0. Signals should
> +still be dispatched within the same statement as they were previously - if
> +this is not the case, or it is possible to create uninterruptable loops, this
> +is a bug, and reports are encouraged of how to recreate such issues.

Since the PERL_ASYNC_CHECK() changes were made to blead, my module
Thread::Suspend has been hanging during 'make test'.  I found that it
hangs in a most peculiar spot:  Right after an 'if' statement inside a
a 'for loop'.  When I put debug statements in, my code looks liek this:

sub threads::suspend
{
    my ($thing, @threads) = @_;

    if ($thing eq 'threads') {
        if (@threads) {
            # Suspend specified list of threads
            @threads = grep { $_ }
                       map  { (ref($_) eq 'threads')
                                    ? $_
                                    : threads->object($_) }
                            @threads;
        } else {
            # Suspend all non-detached threads
            push(@threads, threads->list(threads::running));
        }
    } else {
        # Suspend a single thread
        push(@threads, $thing);
    }

    # Suspend threads
    lock(%SUSPEND);
    foreach my $thr (@threads) {
        my $tid = $thr->tid();
        # Increment suspension count
        if (! $SUSPEND{$tid}++) {
            # Send suspend signal if not currently suspended
            $thr->kill($SIGNAL);
            if (! $thr->is_running()) {
                # Thread terminated before it could be suspended
                delete($SUSPEND{$tid});
            }
print("Debug: sent signal\n");
        }
print("Debug: not hung\n");
    }

    # Return list of affected threads
    return ($thing eq 'threads')
                    ? grep { $_->is_running() } @threads
                    : $thing;
}


When I run the test, I get:

> perl -Ilib t/00_basic.t
1..57
ok 1 - use Thread::Suspend;
# Testing Thread::Suspend 1.19
ok 2 - threads->can(...)
ok 3 - Threads created
ok 4 - No threads suspended
ok 5 - Thread 1 not suspended
ok 6 - Thread 1 running (line 48)
Debug: sent signal
Debug: not hung
ok 7 - One thread suspended
ok 8 - Thread 1 suspended
ok 9 - Thread 1 suspended
ok 10 - Thread 1 stopped (line 54)
Debug: not hung
ok 11 - One thread suspended
ok 12 - Thread 1 suspended
ok 13 - Thread 1 suspended twice
ok 14 - Thread 1 stopped (line 60)
ok 15 - One thread suspended
ok 16 - Thread 1 suspended
ok 17 - Thread 1 still suspended
ok 18 - Thread 1 stopped (line 66)
ok 19 - No threads suspended
ok 20 - Thread 1 not suspended
ok 21 - Thread 1 running (line 71)
ok 22 - No threads suspended
ok 23 - Thread 2 not suspended
ok 24 - Thread 2 running (line 48)
Debug: sent signal


The test is now hung and I have to hit ^C.  This is
very repeatable for me.

Reply via email to