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"; > >