Upgrade to Time::HiRes 1.83
[p5sagit/p5-mst-13.2.git] / ext / Time / HiRes / t / HiRes.t
index 25a97b5..ad4959e 100644 (file)
@@ -31,6 +31,14 @@ my $have_ualarm              = &Time::HiRes::d_ualarm;
 my $have_clock_gettime = &Time::HiRes::d_clock_gettime;
 my $have_clock_getres  = &Time::HiRes::d_clock_getres;
 
+sub has_symbol {
+    my $symbol = shift;
+    eval "use Time::HiRes qw($symbol)";
+    return 0 unless $@ eq '';
+    eval "my \$a = $symbol";
+    return $@ eq '';
+}
+
 printf "# have_gettimeofday  = %d\n", $have_gettimeofday;
 printf "# have_usleep        = %d\n", $have_usleep;
 printf "# have_nanosleep     = %d\n", $have_nanosleep;
@@ -47,10 +55,13 @@ import Time::HiRes 'clock_getres'   if $have_clock_getres;
 
 use Config;
 
+use Time::HiRes qw(gettimeofday);
+
 my $have_alarm = $Config{d_alarm};
 my $have_fork  = $Config{d_fork};
 my $waitfor = 60; # 10-20 seconds is normal (load affects this).
 my $timer_pid;
+my $TheEnd;
 
 if ($have_fork) {
     print "# I am the main process $$, starting the timer process...\n";
@@ -65,7 +76,8 @@ if ($have_fork) {
            print "# This is the timer process $$, over and out.\n";
            exit(0);
        } else {
-           print "# Timer process $timer_pid launched, continuing testing...\n";
+           print "# The timer process $timer_pid launched, continuing testing...\n";
+           $TheEnd = time() + $waitfor;
        }
     } else {
        warn "$0: fork failed: $!\n";
@@ -131,6 +143,7 @@ unless ($have_usleep) {
     skip 7..8;
 }
 else {
+    use Time::HiRes qw(usleep);
     my $one = time;
     usleep(10_000);
     my $two = time;
@@ -169,7 +182,7 @@ unless ($have_usleep && $have_gettimeofday) {
     skip 11;
 }
 else {
-    my $r = [gettimeofday()];
+    my $r = [ gettimeofday() ];
     Time::HiRes::sleep( 0.5 );
     my $f = tv_interval $r;
     ok 11, $f > 0.4 && $f < 0.9, "slept $f instead of 0.5 secs.";
@@ -285,48 +298,49 @@ unless (   defined &Time::HiRes::gettimeofday
 
 unless (   defined &Time::HiRes::setitimer
        && defined &Time::HiRes::getitimer
-       && eval 'use Time::HiRes qw(ITIMER_VIRTUAL); print ITIMER_VIRTUAL'
-       && $Config{d_select}
-       && $Config{d_select}
+       && has_symbol('ITIMER_VIRTUAL')
        && $Config{sig_name} =~ m/\bVTALRM\b/) {
     for (18..19) {
        print "ok $_ # Skip: no virtual interval timers\n";
     }
 } else {
-    use Time::HiRes qw (setitimer getitimer ITIMER_VIRTUAL);
+    use Time::HiRes qw(setitimer getitimer ITIMER_VIRTUAL);
 
     my $i = 3;
     my $r = [Time::HiRes::gettimeofday()];
 
     $SIG{VTALRM} = sub {
-       $i ? $i-- : setitimer(ITIMER_VIRTUAL, 0);
+       $i ? $i-- : setitimer(&ITIMER_VIRTUAL, 0);
        print "# Tick! $i ", Time::HiRes::tv_interval($r), "\n";
     }; 
 
     print "# setitimer: ", join(" ", setitimer(ITIMER_VIRTUAL, 0.5, 0.4)), "\n";
 
     # Assume interval timer granularity of $limit * 0.5 seconds.  Too bold?
-    my $virt = getitimer(ITIMER_VIRTUAL);
+    my $virt = getitimer(&ITIMER_VIRTUAL);
     print "not " unless defined $virt && abs($virt / 0.5) - 1 < $limit;
     print "ok 18\n";
 
     print "# getitimer: ", join(" ", getitimer(ITIMER_VIRTUAL)), "\n";
 
-    while (getitimer(ITIMER_VIRTUAL)) {
+    while (getitimer(&ITIMER_VIRTUAL)) {
        my $j;
        for (1..1000) { $j++ } # Can't be unbreakable, must test getitimer().
     }
 
     print "# getitimer: ", join(" ", getitimer(ITIMER_VIRTUAL)), "\n";
 
-    $virt = getitimer(ITIMER_VIRTUAL);
+    $virt = getitimer(&ITIMER_VIRTUAL);
     print "not " unless defined $virt && $virt == 0;
     print "ok 19\n";
 
     $SIG{VTALRM} = 'DEFAULT';
 }
 
-if ($have_gettimeofday) {
+if ($have_gettimeofday &&
+    $have_usleep) {
+    use Time::HiRes qw(usleep);
+
     my ($t0, $td);
 
     my $sleep = 1.5; # seconds
@@ -456,6 +470,8 @@ if ($have_ualarm && $] >= 5.008001) {
     # one bug that caused a core dump on reentering the handler. This bug
     # was fixed by the time of Perl 5.8.1.
 
+    # Do not try mixing sleep() and alarm() for testing this.
+
     my $a = 0; # Number of alarms we receive.
     my $A = 2; # Number of alarms we will handle before disarming.
                # (We may well get $A + 1 alarms.)
@@ -477,31 +493,40 @@ if ($have_ualarm && $] >= 5.008001) {
     skip 29;
 }
 
-if ($have_clock_gettime) {
-    # All implementations are SUPPOSED TO support CLOCK_REALTIME...
-    eval 'use Time::HiRes qw(CLOCK_REALTIME)';
-    unless ($@) {
-        my $t0 = clock_gettime(&CLOCK_REALTIME);
-        use Time::HiRes qw(sleep);
-        my $T = 0.1;
-        sleep($T);
-        my $t1 = clock_gettime(&CLOCK_REALTIME);
-       if ($t0 > 0 && $t1) {
-           print "# t1 = $t1, t0 = $t0\n";
-           my $dt = $t1 - $t0;
-           my $rt = abs(1 - $dt / $T);
-           if ($rt <= 0.25) { # Allow 25% jitter.
-               print "ok 30 # dt = $dt, r = $rt\n";
+if ($have_clock_gettime &&
+    # All implementations of clock_gettime() 
+    # are SUPPOSED TO support CLOCK_REALTIME.
+    has_symbol('CLOCK_REALTIME')) {
+    my $ok = 0;
+ TRY: {
+       for my $try (1..3) {
+           print "# CLOCK_REALTIME: try = $try\n";
+           my $t0 = clock_gettime(&CLOCK_REALTIME);
+           use Time::HiRes qw(sleep);
+           my $T = 1.5;
+           sleep($T);
+           my $t1 = clock_gettime(&CLOCK_REALTIME);
+           if ($t0 > 0 && $t1 > $t0) {
+               print "# t1 = $t1, t0 = $t0\n";
+               my $dt = $t1 - $t0;
+               my $rt = abs(1 - $dt / $T);
+               print "# dt = $dt, rt = $rt\n";
+               if ($rt <= 2 * $limit) {
+                   $ok = 1;
+                   last TRY;
+               }
            } else {
-               print "not ok 30 # dt = $dt, rt = $rt\n";
+               print "# Error: t0 = $t0, t1 = $t1\n";
            }
-       } else {
-           print "# Error '$!'\n";
-           skip 30;
+           my $r = rand() + rand();
+           printf "# Sleeping for %.6f seconds...\n";
+           sleep($r);
        }
+    }
+    if ($ok) {
+       print "ok 30\n";
     } else {
-        print "# No CLOCK_REALTIME ($@)\n";
-       skip 30;
+       print "not ok 30\n";
     }
 } else {
     print "# No clock_gettime\n";
@@ -522,7 +547,8 @@ if ($have_clock_getres) {
 
 END {
     if (defined $timer_pid) {
-       print "# I am the main process $$, terminating the timer process $timer_pid.\n";
+       my $left = $TheEnd - time();
+       printf "# I am the main process $$, terminating the timer process $timer_pid\n# before it terminates me in %d seconds (testing took %d seconds).\n", $left, $waitfor - $left;
        kill('TERM', $timer_pid); # We are done, the timer can go.
        unlink("ktrace.out"); # Used in BSD system call tracing.
        print "# All done.\n";