Craig A. Berry wrote:
> At 10:44 PM -0500 8/21/07, John E. Malmberg wrote:
>> Can you all look this over?
> 
> I'm cc'ing Jarkko, the author of Time::HiRes.  Something like your
> proposed patch may be necessary for 5.10.  I've kept hoping the tuits
> would arrive for a better solution.

Since 5.10 is quite imminent, should I still go ahead and make a new
release of T::H with the suggested patch?  (The 5.10 track would
integrate the release in due course.)

Yes, finding the right amount of beautifully shaped tuits for this would
be most excellent.

>> This patch skips test 17 on VMS.  It is causing an ASTFLT.
>>
>> The select() system call on VMS is not currently interruptible, so at least 
>> one part of the test is invalid.
>>
>> For some reason, the original code continues to call tick even after the 3 
>> second timeout, and this eventually results in an ASTFLT at a time after the 
>> test appears to be complete.
> 
> What's really happening is unfortunately pretty well understood.  See:
> 
> http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2007-02/msg00058.html
> 
> and follow-ups.
> 
>> --- /rsync_root/perl/ext/Time/HiRes/t/HiRes.t        Sat Mar  3 22:53:41 2007
>> +++ ext/Time/HiRes/t/HiRes.t Tue Aug 21 22:12:52 2007
>> @@ -261,47 +261,54 @@
>>     sleep (0.5);
>>     print "# sleep...", Time::HiRes::tv_interval($r), "\nok 16\n";
>>
>> -    $r = [Time::HiRes::gettimeofday()];
>> -    $i = 5;
>>     my $oldaction;
>> -    if ($use_sigaction) {
>> -    $oldaction = new POSIX::SigAction;
>> -    printf "# sigaction tick, ALRM = %d\n", &POSIX::SIGALRM;
>> -    # Perl's deferred signals may be too wimpy to break through
>> -    # a restartable select(), so use POSIX::sigaction if available.
>> -    POSIX::sigaction(&POSIX::SIGALRM, POSIX::SigAction->new("tick"),
>> -                     $oldaction)
>> -        or die "Error setting SIGALRM handler with sigaction: $!\n";
>> -    } else {
>> -    print "# SIG tick\n";
>> -    $SIG{ALRM} = "tick";
>> -    }
>>
>> -    while ($i > 0)
>> -    {
>> -    alarm(0.3);
>> -    select (undef, undef, undef, 3);
>> -    my $ival = Time::HiRes::tv_interval ($r);
>> -    print "# Select returned! $i $ival\n";
>> -    print "# ", abs($ival/3 - 1), "\n";
>> -    # Whether select() gets restarted after signals is
>> -    # implementation dependent.  If it is restarted, we
>> -    # will get about 3.3 seconds: 3 from the select, 0.3
>> -    # from the alarm.  If this happens, let's just skip
>> -    # this particular test.  --jhi
>> -    if (abs($ival/3.3 - 1) < $limit) {
>> -        $ok = "Skip: your select() may get restarted by your SIGALRM (or 
>> just retry test)";
>> -        undef $not;
>> -        last;
>> +    # on VMS timers can not interrupt select.
>> +    if ($^O ne 'VMS') {
>> +    $r = [Time::HiRes::gettimeofday()];
>> +    $i = 5;
>> +    if ($use_sigaction) {
>> +        $oldaction = new POSIX::SigAction;
>> +        printf "# sigaction tick, ALRM = %d\n", &POSIX::SIGALRM;
>> +        # Perl's deferred signals may be too wimpy to break through
>> +        # a restartable select(), so use POSIX::sigaction if available.
>> +        POSIX::sigaction(&POSIX::SIGALRM, POSIX::SigAction->new("tick"),
>> +                         $oldaction)
>> +            or die "Error setting SIGALRM handler with sigaction: $!\n";
>> +    } else {
>> +        print "# SIG tick\n";
>> +        $SIG{ALRM} = "tick";
>>      }
>> -    my $exp = 0.3 * (5 - $i);
>> -    # This test is more sensitive, so impose a softer limit.
>> -    if (abs($ival/$exp - 1) > 3*$limit) {
>> -        my $ratio = abs($ival/$exp);
>> -        $not = "while: $exp sleep took $ival ratio $ratio";
>> -        last;
>> +
>> +    while ($i > 0)
>> +    {
>> +        alarm(0.3);
>> +        select (undef, undef, undef, 3);
>> +        my $ival = Time::HiRes::tv_interval ($r);
>> +        print "# Select returned! $i $ival\n";
>> +        print "# ", abs($ival/3 - 1), "\n";
>> +        # Whether select() gets restarted after signals is
>> +        # implementation dependent.  If it is restarted, we
>> +        # will get about 3.3 seconds: 3 from the select, 0.3
>> +        # from the alarm.  If this happens, let's just skip
>> +        # this particular test.  --jhi
>> +        if (abs($ival/3.3 - 1) < $limit) {
>> +            $ok =
>> + "Skip: your select() may get restarted by your SIGALRM (or just retry 
>> test)";
>> +            undef $not;
>> +            last;
>> +            }
>> +        my $exp = 0.3 * (5 - $i);
>> +        # This test is more sensitive, so impose a softer limit.
>> +        if (abs($ival/$exp - 1) > 3*$limit) {
>> +            my $ratio = abs($ival/$exp);
>> +            $not = "while: $exp sleep took $ival ratio $ratio";
>> +            last;
>> +        }
>> +        $ok = $i;
>>      }
>> -    $ok = $i;
>> +    } else {
>> +    $ok = "Skip: VMS select() does not get interrupted.";
>>     }
>>
>>     sub tick
>> @@ -318,10 +325,13 @@
>>      }
>>     }
>>
>> -    if ($use_sigaction) {
>> -    POSIX::sigaction(&POSIX::SIGALRM, $oldaction);
>> -    } else {
>> -    alarm(0); # can't cancel usig %SIG
>> +
>> +    if ($^O ne 'VMS') {
>> +    if ($use_sigaction) {
>> +        POSIX::sigaction(&POSIX::SIGALRM, $oldaction);
>> +    } else {
>> +        alarm(0); # can't cancel usig %SIG
>> +    }
>>     }
>>
>>     print $not ? "not ok 17 # $not\n" : "ok 17 # $ok\n";
> 
> 

Reply via email to