<pre style='margin:0'>
Mojca Miklavec (mojca) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/84566682ab5da0b44d28c74220e9d8f7305dd2a5">https://github.com/macports/macports-ports/commit/84566682ab5da0b44d28c74220e9d8f7305dd2a5</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 8456668  perl5: update to 5.24.2, patch to fix test
</span>8456668 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 84566682ab5da0b44d28c74220e9d8f7305dd2a5
</span>Author: Zero King <l2dy@macports.org>
AuthorDate: Thu Jul 20 15:27:02 2017 +0000

<span style='display:block; white-space:pre;color:#404040;'>    perl5: update to 5.24.2, patch to fix test
</span>---
 lang/perl5/Portfile                                |    6 +-
 .../files/5.24/patch-dist-Time-HiRes-HiRes.xs.diff |   14 -
 lang/perl5/files/5.24/patch-dist-Time-HiRes.diff   | 1415 ++++++++++++++++++++
 3 files changed, 1418 insertions(+), 17 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/perl5/Portfile b/lang/perl5/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 2bb7097..b9e77f4 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/perl5/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/perl5/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4,7 +4,7 @@ PortSystem          1.0
</span> PortGroup           perl5 1.0
 
 name                perl5
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version             5.24.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version             5.24.2
</span> categories          lang
 platforms           darwin freebsd linux
 license             {Artistic-1 GPL}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -26,7 +26,7 @@ set perl5.versions_info {
</span>     5.18 4 3 d97181a98f7acc80125b0d2a182a6a2cd7542ceb  1fb4d27b75cd244e849f253320260efe1750641aaff4a18ce0d67556ff1b96a5
     5.20 3 2 499846a1c92e00dd357cb782bc14787b8cd47051  1b40068166c242e34a536836286e70b78410602a80615143301e52aa2901493b
     5.22 3 0 4a823625f60db7dd05c62ff73ff0ee0d66f07dfc  770dd077a67a382501ab195cc75eee0baa5efa3544892c9a713a5bdb2645449f
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    5.24 1 0 e824cb74998ebbbc3286fa353e64e75104d4c5b1  482ac5dca262b57d26c381382a3e057b22ede631fcce32523c004b8bf773f6f0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    5.24 2 0 a50397964e25396ffc43167819a70043fcfaf194  e28c8fa588c4227eb25350036b45d7b1b46d61bb3a2194ee09dc79be6ed0fd0f
</span>     5.26 0 0 a853a1ec299d7c6ba8239e8ed444ee6d922b8938  f21d66de84982175e95ad15fd8d0e22fed2cc2de7e4394f5d48dbe451be2f6f2
 }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -87,7 +87,7 @@ foreach {perl5.v perl5.subversion perl5.revision perl5.rmd160 perl5.sha256} ${pe
</span>             # Prevent build error on Sierra
             # https://trac.macports.org/ticket/52012
             patchfiles-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            ${perl5.major}/patch-dist-Time-HiRes-HiRes.xs.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            ${perl5.major}/patch-dist-Time-HiRes.diff
</span>             patchfiles-append \
                             ${perl5.major}/fix-ld-modification.patch
         }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/perl5/files/5.24/patch-dist-Time-HiRes-HiRes.xs.diff b/lang/perl5/files/5.24/patch-dist-Time-HiRes-HiRes.xs.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 5a4e06a..0000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/perl5/files/5.24/patch-dist-Time-HiRes-HiRes.xs.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,14 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-https://trac.macports.org/ticket/52012
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-https://github.com/Homebrew/homebrew-core/issues/1957#issuecomment-226850273
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- dist/Time-HiRes/HiRes.xs.orig
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ dist/Time-HiRes/HiRes.xs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -940,7 +940,7 @@ BOOT:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #   endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#if defined(PERL_DARWIN)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined(PERL_DARWIN) && !defined(CLOCK_REALTIME)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  ifdef USE_ITHREADS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   MUTEX_INIT(&darwin_time_mutex);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/perl5/files/5.24/patch-dist-Time-HiRes.diff b/lang/perl5/files/5.24/patch-dist-Time-HiRes.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..2a791a6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/perl5/files/5.24/patch-dist-Time-HiRes.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,1415 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+https://github.com/macports/macports-ports/pull/607
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+https://perl5.git.perl.org/perl.git/commit/c4a535af41823cc84534bf8dbecfdcc3eb7daa86
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- MANIFEST
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ MANIFEST
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3557,6 +3557,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dist/Time-HiRes/t/tv_interval.t           Test for Time::HiRes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dist/Time-HiRes/t/ualarm.t                Test for Time::HiRes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dist/Time-HiRes/t/usleep.t                Test for Time::HiRes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++dist/Time-HiRes/t/utime.t         Test for Time::HiRes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dist/Time-HiRes/t/Watchdog.pm             Test for Time::HiRes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dist/Time-HiRes/typemap                   Time::HiRes extension
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dist/XSLoader/Makefile.PL Dynamic Loader makefile writer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- Porting/Maintainers.pl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ Porting/Maintainers.pl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1374,7 +1374,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'Time::HiRes' => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        'DISTRIBUTION' => 'RJBS/Time-HiRes-1.9728.tar.gz',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        'DISTRIBUTION' => 'JHI/Time-HiRes-1.9739.tar.gz',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         'FILES'        => q[dist/Time-HiRes],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/Changes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/Changes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,55 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Revision history for the Perl extension Time::HiRes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1.9739 [2016-06-28]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - the upcoming macOS 10.12 (Sierra, the operating system formerly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    known as OS X, or Darwin) has implemented the clock_gettime()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    and clock_getres() interfaces but not the clock_nanosleep()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1.9738 [2016-06-26]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - fix the dates in the Changes, it's not July yet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [rt.cpan.org #115553]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - in cygwin, drop the utime.t expected timestamp resolution
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - documented for utime that the actual timestamp resolution depends
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    on the operating system and the filesystem, just like for stat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - looks like in gnukfreebsd 10.1 neither futimens or utimensat work
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    even though they exist, skipping utime tests there for now
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - demodernize the Test::More use in utime.t (no subtest) to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    better support older Perl installations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - for all the tests, drop the Test::More 0.82 requirement,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    the only "modern" thing used is the note routine which
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    can be replaced with print("# ...\n") (or printf),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    with this works back at least with Test::More 0.54 (perl 5.8.7) 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1.9737 [2016-06-22]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - utime in HiRes.xs had dXSARGS which was unnecessary, leading
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    to two markstack pops, panic, and two-minute wait for the watchdog
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    (thanks to Dave Mitchell for the eagle-eye)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - even though 5.10.x should have the Perl_ck_warner, many CPAN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    smokes proved otherwise, so requiring now at least 5.12 for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Perl_ck_warner use in IS_SAFE_PATHNAME() 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1.9736 [2016-06-22]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - the IS_SAFE_PATHNAME() emulation was too modern for Perl 5.10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - make it so that only one value is set for -DTIME_HIRES_STAT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    even on systems that support many options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - the 1.9734 (only released in blead, and as part of the development
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    release 5.25.2) fix for Darwin's clock_gettime was wrong under
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    threaded builds, leading into mutex panics in clock.t 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - the d_hires_utime determination was made more precise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - the utime.t was failing in platforms where only one of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    futimens/utimensat was present (neither or both was okay)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1.9735 [2016-06-20]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - Time::HiRes should override `utime` to allow setting hires
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    (futimens and utimensat support)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [rt.perl.org #114809]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - the utime patch used IS_SAFE_PATHNAME() which isn't available in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    too old Perls, so emulate (in case the Devel::PPPort is too old)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1.9734 [2016-06-17]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  - fix Darwins with clock_gettime: blead 2d41a263
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [rt.perl.org #128427]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1.9733 [2016-04-23]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   - C90 declaration-after-statement error with darwin threads: blead de1003b4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [rt.cpan.org #113856]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/HiRes.pm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/HiRes.pm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -23,12 +23,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            TIMER_ABSTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           d_nanosleep d_clock_gettime d_clock_getres
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           d_nanosleep d_clock_gettime d_clock_getres d_hires_utime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            d_clock d_clock_nanosleep
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           stat lstat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           stat lstat utime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-our $VERSION = '1.9733';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++our $VERSION = '1.9739';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ our $XS_VERSION = $VERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $VERSION = eval $VERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -60,6 +60,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ($i eq 'clock'           && !&d_clock)           ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ($i eq 'nanosleep'       && !&d_nanosleep)       ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ($i eq 'usleep'          && !&d_usleep)          ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      ($i eq 'utime'           && !&d_hires_utime)     ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ($i eq 'ualarm'          && !&d_ualarm)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       require Carp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       Carp::croak("Time::HiRes::$i(): unimplemented in this platform");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -92,7 +93,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 clock_gettime clock_getres clock_nanosleep clock
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      stat lstat );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      stat lstat utime);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   usleep ($microseconds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   nanosleep ($nanoseconds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -137,6 +138,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my @stat = stat(FH);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my @stat = lstat("file");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  use Time::HiRes qw( utime );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  utime $floating_seconds, $floating_seconds, file...;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ =head1 DESCRIPTION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ The C<Time::HiRes> module implements a Perl interface to the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -446,6 +450,26 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ the access time stamp from t2 need not be greater-than the modify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ time stamp from t1: it may be equal or I<less>.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++=item utime LIST
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++As L<perlfunc/utime>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++but with the ability to set the access/modify file timestamps
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++in subsecond resolution, if the operating system and the filesystem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++both support such timestamps.  To override the standard utime():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    use Time::HiRes qw(utime);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Test for the value of &Time::HiRes::d_hires_utime to find out whether
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++the operating system supports setting subsecond file timestamps.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++As with CORE::utime(), passing undef as both the atime and mtime will
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++call the syscall with a NULL argument.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The actual achievable subsecond resolution depends on the combination
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++of the operating system and the filesystem.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Returns the number of files successfully changed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ =back
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ =head1 EXAMPLES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -586,9 +610,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Some systems have APIs but not implementations: for example QNX and Haiku
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ have the interval timer APIs but not the functionality.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-In OS X clock_getres(), clock_gettime() and clock_nanosleep() are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-emulated using the Mach timers; as a side effect of being emulated
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-the CLOCK_REALTIME and CLOCK_MONOTONIC are the same timer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++In pre-Sierra macOS (pre-10.12, OS X) clock_getres(), clock_gettime()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++and clock_nanosleep() are emulated using the Mach timers; as a side
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++effect of being emulated the CLOCK_REALTIME and CLOCK_MONOTONIC are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++the same timer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++gnukfreebsd seems to have non-functional futimens() and utimensat()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++(at least as of 10.1): therefore the hires utime() does not work.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ =head1 SEE ALSO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/HiRes.xs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/HiRes.xs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -747,21 +747,33 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif /* !TIME_HIRES_STAT */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-/* Until Apple implements clock_gettime() (ditto clock_getres())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * we will emulate it using Mach interfaces. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(PERL_DARWIN) && !defined(CLOCK_REALTIME)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  include <mach/mach_time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Until Apple implements clock_gettime()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * (ditto clock_getres() and clock_nanosleep())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * we will emulate them using the Mach kernel interfaces. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(PERL_DARWIN) && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  (defined(TIME_HIRES_CLOCK_GETTIME_EMULATION)   || \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   defined(TIME_HIRES_CLOCK_GETRES_EMULATION)    || \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   defined(TIME_HIRES_CLOCK_NANOSLEEP_EMULATION))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef CLOCK_REALTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  define CLOCK_REALTIME  0x01
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  define CLOCK_MONOTONIC 0x02
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef TIMER_ABSTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  define TIMER_ABSTIME   0x01
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef USE_ITHREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  define PERL_DARWIN_MUTEX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef PERL_DARWIN_MUTEX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ STATIC perl_mutex darwin_time_mutex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach_time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static uint64_t absolute_time_init;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static mach_timebase_info_data_t timebase_info;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static struct timespec timespec_init;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -769,7 +781,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int darwin_time_init() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   struct timeval tv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int success = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef USE_ITHREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef PERL_DARWIN_MUTEX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MUTEX_LOCK(&darwin_time_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (absolute_time_init == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -784,12 +796,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef USE_ITHREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef PERL_DARWIN_MUTEX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MUTEX_UNLOCK(&darwin_time_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return success;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TIME_HIRES_CLOCK_GETTIME_EMULATION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int clock_gettime(int clock_id, struct timespec *ts) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (darwin_time_init() && timebase_info.denom) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     switch (clock_id) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -821,7 +834,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SETERRNO(EINVAL, LIB_INVARG);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* TIME_HIRES_CLOCK_GETTIME_EMULATION */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TIME_HIRES_CLOCK_GETRES_EMULATION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int clock_getres(int clock_id, struct timespec *ts) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (darwin_time_init() && timebase_info.denom) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     switch (clock_id) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -841,7 +856,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SETERRNO(EINVAL, LIB_INVARG);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* TIME_HIRES_CLOCK_GETRES_EMULATION */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TIME_HIRES_CLOCK_NANOSLEEP_EMULATION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int clock_nanosleep(int clock_id, int flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      const struct timespec *rqtp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      struct timespec *rmtp) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -879,6 +896,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SETERRNO(EINVAL, LIB_INVARG);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* TIME_HIRES_CLOCK_NANOSLEEP_EMULATION */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif /* PERL_DARWIN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -921,6 +939,22 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* In case Perl and/or Devel::PPPort are too old, minimally emulate
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * IS_SAFE_PATHNAME() (which looks for zero bytes in the pathname). */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef IS_SAFE_PATHNAME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if PERL_VERSION >= 12 /* Perl_ck_warner is 5.10.0 -> */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef WARN_SYSCALLS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define WARNEMUCAT WARN_SYSCALLS /* 5.22.0 -> */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define WARNEMUCAT WARN_MISC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define WARNEMU(opname) Perl_ck_warner(aTHX_ packWARN(WARNEMUCAT), "Invalid \\0 character in pathname for %s",opname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define WARNEMU(opname) Perl_warn(aTHX_ "Invalid \\0 character in pathname for %s",opname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define IS_SAFE_PATHNAME(pv, len, opname) (((len)>1)&&memchr((pv), 0, (len)-1)?(SETERRNO(ENOENT, LIB_INVARG),WARNEMU(opname),FALSE):(TRUE))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ MODULE = Time::HiRes            PACKAGE = Time::HiRes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ PROTOTYPES: ENABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -941,7 +975,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #   endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(PERL_DARWIN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#  ifdef USE_ITHREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#  if defined(USE_ITHREADS) && defined(PERL_DARWIN_MUTEX)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MUTEX_INIT(&darwin_time_mutex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1317,6 +1351,82 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif /* #if defined(HAS_GETITIMER) && defined(HAS_SETITIMER) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(TIME_HIRES_UTIME)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++I32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++utime(accessed, modified, ...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++PROTOTYPE: $$@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    PREINIT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  SV* accessed;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  SV* modified;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  SV* file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct timespec utbuf[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct timespec *utbufp = utbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  int tot;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    CODE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  accessed = ST(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  modified = ST(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  items -= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  tot = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if ( accessed == &PL_sv_undef && modified == &PL_sv_undef )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          utbufp = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if (SvNV(accessed) < 0.0 || SvNV(modified) < 0.0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  croak("Time::HiRes::utime(%"NVgf", %"NVgf"): negative time not invented yet", SvNV(accessed), SvNV(modified));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          Zero(&utbuf, sizeof utbuf, char);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          utbuf[0].tv_sec = (Time_t)SvNV(accessed);  /* time accessed */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          utbuf[0].tv_nsec = (long)( ( SvNV(accessed) - utbuf[0].tv_sec ) * 1e9 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          utbuf[1].tv_sec = (Time_t)SvNV(modified);  /* time modified */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          utbuf[1].tv_nsec = (long)( ( SvNV(modified) - utbuf[1].tv_sec ) * 1e9 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  while (items > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          file = POPs; items--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if (SvROK(file) && GvIO(SvRV(file)) && IoIFP(sv_2io(SvRV(file)))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  int fd =  PerlIO_fileno(IoIFP(sv_2io(file)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (fd < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          SETERRNO(EBADF,RMS_IFI);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  else 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef HAS_FUTIMENS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (futimens(fd, utbufp) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          tot++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else  /* HAS_FUTIMES */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          croak("futimens unimplemented in this platform");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* HAS_FUTIMES */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef HAS_UTIMENSAT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  STRLEN len;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  char * name = SvPV(file, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if (IS_SAFE_PATHNAME(name, len, "utime") &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      utimensat(AT_FDCWD, name, utbufp, 0) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          tot++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else  /* HAS_UTIMENSAT */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  croak("utimensat unimplemented in this platform");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* HAS_UTIMENSAT */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  } /* while items */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  RETVAL = tot;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    OUTPUT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  RETVAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else  /* #if defined(TIME_HIRES_UTIME) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++I32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++utime(accessed, modified, ...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    CODE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        croak("Time::HiRes::utime(): unimplemented in this platform");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        RETVAL = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    OUTPUT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  RETVAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* #if defined(TIME_HIRES_UTIME) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(TIME_HIRES_CLOCK_GETTIME)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NV
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/Makefile.PL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/Makefile.PL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -354,6 +354,41 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++sub has_futimens {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 1 if
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try_compile_and_link(<<EOM);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "EXTERN.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "perl.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "XSUB.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int main(int argc, char** argv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct timespec ts[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ret = futimens(0, ts);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ret == 0 ? exit(0) : exit(errno ? errno : -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++sub has_utimensat{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 1 if
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try_compile_and_link(<<EOM);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "EXTERN.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "perl.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "XSUB.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int main(int argc, char** argv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct timespec ts[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ret = utimensat(AT_FDCWD, 0, ts, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ret == 0 ? exit(0) : exit(errno ? errno : -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sub DEFINE {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my ($def, $val) = @_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $define = defined $val ? "$def=$val" : $def ;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -548,7 +583,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } elsif ($^O eq 'darwin') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        $has_clock_gettime_emulation++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        $has_clock_gettime++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       $DEFINE .= ' -DTIME_HIRES_CLOCK_GETTIME';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       $DEFINE .= ' -DTIME_HIRES_CLOCK_GETTIME -DTIME_HIRES_CLOCK_GETTIME_EMULATION';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_clock_gettime) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -577,7 +612,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } elsif ($^O eq 'darwin') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        $has_clock_getres_emulation++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        $has_clock_getres++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       $DEFINE .= ' -DTIME_HIRES_CLOCK_GETRES';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       $DEFINE .= ' -DTIME_HIRES_CLOCK_GETRES -DTIME_HIRES_CLOCK_GETRES_EMULATION';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_clock_getres) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -603,7 +638,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } elsif ($^O eq 'darwin') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         $has_clock_nanosleep++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         $has_clock_nanosleep_emulation++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  $DEFINE .= ' -DTIME_HIRES_CLOCK_NANOSLEEP';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  $DEFINE .= ' -DTIME_HIRES_CLOCK_NANOSLEEP -DTIME_HIRES_CLOCK_NANOSLEEP_EMULATION';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_clock_nanosleep) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -631,6 +666,36 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   print "NOT found.\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print "Looking for futimens()... ";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    my $has_futimens;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (has_futimens()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        $has_futimens++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  $DEFINE .= ' -DHAS_FUTIMENS';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ($has_futimens) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        print "found.\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print "NOT found.\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print "Looking for utimensat()... ";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    my $has_utimensat;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (has_utimensat()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        $has_utimensat++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  $DEFINE .= ' -DHAS_UTIMENSAT';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ($has_utimensat) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        print "found.\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print "NOT found.\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ($has_futimens or $has_utimensat) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  $DEFINE .= ' -DTIME_HIRES_UTIME';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     print "Looking for stat() subsecond timestamps...\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     print "Trying struct stat st_atimespec.tv_nsec...";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -644,7 +709,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       $has_stat_st_xtimespec++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      DEFINE('TIME_HIRES_STAT', 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      DEFINE('TIME_HIRES_STAT_ST_XTIMESPEC');  # 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_stat_st_xtimespec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -664,7 +729,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       $has_stat_st_xtimensec++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      DEFINE('TIME_HIRES_STAT', 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      DEFINE('TIME_HIRES_STAT_ST_XTIMENSEC');  # 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_stat_st_xtimensec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -684,7 +749,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       $has_stat_st_xtime_n++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      DEFINE('TIME_HIRES_STAT', 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      DEFINE('TIME_HIRES_STAT_ST_XTIME_N');  # 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_stat_st_xtime_n) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -704,7 +769,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       $has_stat_st_xtim++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      DEFINE('TIME_HIRES_STAT', 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      DEFINE('TIME_HIRES_STAT_XTIM');  # 4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_stat_st_xtim) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -724,7 +789,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EOM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       $has_stat_st_uxtime++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      DEFINE('TIME_HIRES_STAT', 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      DEFINE('TIME_HIRES_STAT_ST_UXTIME');  # 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($has_stat_st_uxtime) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -733,6 +798,19 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   print "NOT found.\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    # See HiRes.xs hrstatns()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ($has_stat_st_xtimespec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        DEFINE('TIME_HIRES_STAT', 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } elsif ($has_stat_st_xtimensec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        DEFINE('TIME_HIRES_STAT', 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } elsif ($has_stat_st_xtime_n) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        DEFINE('TIME_HIRES_STAT', 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } elsif ($has_stat_st_xtim) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        DEFINE('TIME_HIRES_STAT', 4);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } elsif ($has_stat_st_uxtime) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        DEFINE('TIME_HIRES_STAT', 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }    
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if ($DEFINE =~ /-DTIME_HIRES_STAT=\d+/) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     print "You seem to have stat() subsecond timestamps.\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     print "(Your struct stat has them, but the filesystems must help.)\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -791,7 +869,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       'DynaLoader' => 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       'Exporter' => 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       'ExtUtils::MakeMaker' => 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      'Test::More' => "0.82",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      'Test::More' => 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       'strict' => 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   'dist'      => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -869,7 +947,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   foreach (qw (d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                d_nanosleep d_clock_gettime d_clock_getres
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               d_clock d_clock_nanosleep d_hires_stat)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               d_clock d_clock_nanosleep d_hires_stat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     d_futimens d_utimensat d_hires_utime)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $macro = $_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if ($macro =~ /^(d_nanosleep|d_clock)$/) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $macro =~ s/^d_(.+)/TIME_HIRES_\U$1/;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -879,6 +958,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           push @names, {name => $_, macro => "TIME_HIRES_STAT", value => $d_hires_stat,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         default => ["IV", "0"]};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           next;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      } elsif ($macro =~ /^(d_hires_utime)$/) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          my $d_hires_utime =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    ($DEFINE =~ /-DHAS_FUTIMENS/ ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     $DEFINE =~ /-DHAS_UTIMENSAT/) ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          push @names, {name => $_, macro => "TIME_HIRES_UTIME", value => $d_hires_utime,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        default => ["IV", "0"]};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          next;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       } elsif ($macro =~ /^(d_clock_gettime|d_clock_getres|d_clock_nanosleep)$/) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $macro =~ s/^d_(.+)/TIME_HIRES_\U$1/;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           my $val = ($DEFINE =~ /-D$macro\b/) ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/fallback/const-c.inc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/fallback/const-c.inc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -19,6 +19,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef pTHX_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define pTHX_ /* 5.6 or later define this for threading support.  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ constant_11 (pTHX_ const char *name, IV *iv_return) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /* When generated this function returned values for the list of names given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -87,6 +88,51 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++constant_13 (pTHX_ const char *name, IV *iv_return) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /* When generated this function returned values for the list of names given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     here.  However, subsequent manual editing may have added or removed some.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     CLOCK_HIGHRES TIMER_ABSTIME d_hires_utime */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /* Offset 1 gives the best switch position.  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  switch (name[1]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case 'I':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (memEQ(name, "TIMER_ABSTIME", 13)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /*                ^                  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TIMER_ABSTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      *iv_return = TIMER_ABSTIME;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return PERL_constant_ISIV;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return PERL_constant_NOTDEF;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case 'L':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (memEQ(name, "CLOCK_HIGHRES", 13)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /*                ^                  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef CLOCK_HIGHRES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      *iv_return = CLOCK_HIGHRES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return PERL_constant_ISIV;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return PERL_constant_NOTDEF;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case '_':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (memEQ(name, "d_hires_utime", 13)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /*                ^                  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef TIME_HIRES_UTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      *iv_return = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return PERL_constant_ISIV;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      *iv_return = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return PERL_constant_ISIV;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return PERL_constant_NOTFOUND;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ constant_14 (pTHX_ const char *name, IV *iv_return) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /* When generated this function returned values for the list of names given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      here.  However, subsequent manual editing may have added or removed some.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -250,16 +296,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {name=>"d_getitimer", type=>"IV", macro=>"HAS_GETITIMER", value=>"1", default=>["IV", "0"]},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {name=>"d_gettimeofday", type=>"IV", macro=>"HAS_GETTIMEOFDAY", value=>"1", default=>["IV", "0"]},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {name=>"d_hires_stat", type=>"IV", macro=>"TIME_HIRES_STAT", value=>"1", default=>["IV", "0"]},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            {name=>"d_hires_utime", type=>"IV", macro=>"TIME_HIRES_UTIME", value=>"1", default=>["IV", "0"]},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {name=>"d_nanosleep", type=>"IV", macro=>"TIME_HIRES_NANOSLEEP", value=>"1", default=>["IV", "0"]},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {name=>"d_setitimer", type=>"IV", macro=>"HAS_SETITIMER", value=>"1", default=>["IV", "0"]},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {name=>"d_ualarm", type=>"IV", macro=>"HAS_UALARM", value=>"1", default=>["IV", "0"]},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {name=>"d_usleep", type=>"IV", macro=>"HAS_USLEEP", value=>"1", default=>["IV", "0"]});
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-print constant_types(); # macro defs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print constant_types(), "\n"; # macro defs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach (C_constant ("Time::HiRes", 'constant', 'IV', $types, undef, 3, @names) ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     print $_, "\n"; # C constant subs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-print "#### XS Section:\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print "\n#### XS Section:\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ print XS_constant ("Time::HiRes", $types);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __END__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -322,33 +369,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case 13:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Names all of length 13.  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* CLOCK_HIGHRES TIMER_ABSTIME */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Offset 2 gives the best switch position.  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    switch (name[2]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case 'M':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if (memEQ(name, "TIMER_ABSTIME", 13)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      /*                 ^                 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef TIMER_ABSTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        *iv_return = TIMER_ABSTIME;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return PERL_constant_ISIV;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return PERL_constant_NOTDEF;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case 'O':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if (memEQ(name, "CLOCK_HIGHRES", 13)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      /*                 ^                 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef CLOCK_HIGHRES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        *iv_return = CLOCK_HIGHRES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return PERL_constant_ISIV;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return PERL_constant_NOTDEF;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return constant_13 (aTHX_ name, iv_return);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case 14:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return constant_14 (aTHX_ name, iv_return);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/Watchdog.pm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/Watchdog.pm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -10,44 +10,44 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $TheEnd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ($Config{d_fork}) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "I am the main process $$, starting the watchdog process...";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# I am the main process $$, starting the watchdog process...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $watchdog_pid = fork();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (defined $watchdog_pid) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if ($watchdog_pid == 0) { # We are the kid, set up the watchdog.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $ppid = getppid();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      note "I am the watchdog process $$, sleeping for $waitfor seconds...";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      print("# I am the watchdog process $$, sleeping for $waitfor seconds...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       sleep($waitfor - 2);    # Workaround for perlbug #49073
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       sleep(2);               # Wait for parent to exit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (kill(0, $ppid)) {   # Check if parent still exists
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           warn "\n$0: overall time allowed for tests (${waitfor}s) exceeded!\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          note "Terminating main process $ppid...";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          print("Terminating main process $ppid...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           kill('KILL', $ppid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          note "This is the watchdog process $$, over and out.";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          print("# This is the watchdog process $$, over and out.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       exit(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      note "The watchdog process $watchdog_pid launched, continuing testing...";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      print("# The watchdog process $watchdog_pid launched, continuing testing...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       $TheEnd = time() + $waitfor;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   warn "$0: fork failed: $!\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "No watchdog process (need fork)";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# No watchdog process (need fork)\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ END {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($watchdog_pid) { # Only in the main process.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $left = $TheEnd - time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note sprintf "I am the main process $$, terminating the watchdog process $watchdog_pid before it terminates me in %d seconds (testing took %d seconds).", $left, $waitfor - $left;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  printf("# I am the main process $$, terminating the watchdog process $watchdog_pid before it terminates me in %d seconds (testing took %d seconds).\n", $left, $waitfor - $left);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (kill(0, $watchdog_pid)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       local $? = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $kill = kill('KILL', $watchdog_pid); # We are done, the watchdog can go.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       wait();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      note sprintf "kill KILL $watchdog_pid = %d", $kill;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      printf("# kill KILL $watchdog_pid = %d\n", $kill);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unlink("ktrace.out"); # Used in BSD system call tracing.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "All done.";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# All done.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/alarm.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/alarm.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use strict;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BEGIN { require_ok "Time::HiRes"; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -29,12 +29,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my ($r, $i, $not, $ok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    $not = "";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $r = [Time::HiRes::gettimeofday()];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $i = 5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $oldaction;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ($use_sigaction) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $oldaction = new POSIX::SigAction;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note sprintf "sigaction tick, ALRM = %d", &POSIX::SIGALRM;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  printf("# sigaction tick, ALRM = %d\n", &POSIX::SIGALRM);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   # Perl's deferred signals may be too wimpy to break through
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   # a restartable select(), so use POSIX::sigaction if available.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -44,7 +46,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    $oldaction)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       or die "Error setting SIGALRM handler with sigaction: $!\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "SIG tick";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# SIG tick\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $SIG{ALRM} = "tick";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -56,8 +58,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       Time::HiRes::alarm(0.3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       select (undef, undef, undef, 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $ival = Time::HiRes::tv_interval ($r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      note "Select returned! $i $ival";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      note abs($ival/3 - 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      print("# Select returned! $i $ival\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      printf("# %s\n", abs($ival/3 - 1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       # Whether select() gets restarted after signals is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       # implementation dependent.  If it is restarted, we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       # will get about 3.3 seconds: 3 from the select, 0.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -86,7 +88,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sub tick {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $i--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $ival = Time::HiRes::tv_interval ($r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "Tick! $i $ival";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# Tick! $i $ival\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $exp = 0.3 * (5 - $i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if ($exp == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       $not = "tick: divisor became zero";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -106,8 +108,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Time::HiRes::alarm(0); # can't cancel usig %SIG
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# $not\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok !$not;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note $not || $ok;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -126,7 +128,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # http://groups.google.com/group/perl.perl5.porters/browse_thread/thread/adaffaaf939b042e/20dafc298df737f0%2320dafc298df737f0?sa=X&oi=groupsr&start=0&num=3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # Perl changes [18765] and [18770], perl bug [perl #20920]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "Finding delay loop...";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# Finding delay loop...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $T = 0.01;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $DelayN = 1024;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -137,7 +139,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    for ($i = 0; $i < $DelayN; $i++) { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    my $t1 = Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    my $dt = $t1 - $t0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-   note "N = $DelayN, t1 = $t1, t0 = $t0, dt = $dt";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   print("# N = $DelayN, t1 = $t1, t0 = $t0, dt = $dt\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    last N if $dt > $T;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    $DelayN *= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      } while (1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -169,7 +171,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $SIG{ALRM} = sub {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $a++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "Alarm $a - ", Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  printf("# Alarm $a - %s\n", Time::HiRes::time());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Time::HiRes::alarm(0) if $a >= $A; # Disarm the alarm.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $Delay->(2); # Try burning CPU at least for 2T seconds.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }; 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -204,18 +206,18 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $alrm = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $SIG{ALRM} = sub { $alrm++ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $got = Time::HiRes::alarm(2.7);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ok $got == 0 or note $got;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ok $got == 0 or print("# $got\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $t0 = Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   1 while Time::HiRes::time() - $t0 <= 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $got = Time::HiRes::alarm(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ok $got > 0 && $got < 1.8 or note $got;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ok $got > 0 && $got < 1.8 or print("# $got\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ok $alrm == 0 or note $alrm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ok $alrm == 0 or print("# $alrm\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $got = Time::HiRes::alarm(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ok $got == 0 or note $got;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ok $got == 0 or print("# $got\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/clock.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/clock.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use strict;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BEGIN { require_ok "Time::HiRes"; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -13,10 +13,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return $@ eq '';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note sprintf "have_clock_gettime   = %d", &Time::HiRes::d_clock_gettime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note sprintf "have_clock_getres    = %d", &Time::HiRes::d_clock_getres;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note sprintf "have_clock_nanosleep = %d", &Time::HiRes::d_clock_nanosleep;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note sprintf "have_clock           = %d", &Time::HiRes::d_clock;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# have_clock_gettime   = %d\n", &Time::HiRes::d_clock_gettime);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# have_clock_getres    = %d\n", &Time::HiRes::d_clock_getres);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# have_clock_nanosleep = %d\n", &Time::HiRes::d_clock_nanosleep);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# have_clock           = %d\n", &Time::HiRes::d_clock);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Ideally, we'd like to test that the timers are rather precise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # However, if the system is busy, there are no guarantees on how
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,25 +36,25 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $ok = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  TRY: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for my $try (1..3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      note "CLOCK_REALTIME: try = $try";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      print("# CLOCK_REALTIME: try = $try\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $t0 = Time::HiRes::clock_gettime(&CLOCK_REALTIME);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $T = 1.5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       Time::HiRes::sleep($T);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $t1 = Time::HiRes::clock_gettime(&CLOCK_REALTIME);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if ($t0 > 0 && $t1 > $t0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          note "t1 = $t1, t0 = $t0";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          print("# t1 = $t1, t0 = $t0\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           my $dt = $t1 - $t0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           my $rt = abs(1 - $dt / $T);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          note "dt = $dt, rt = $rt";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          print("# dt = $dt, rt = $rt\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if ($rt <= 2 * $limit) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               $ok = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               last TRY;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          note "Error: t0 = $t0, t1 = $t1";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          print("# Error: t0 = $t0, t1 = $t1\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       my $r = rand() + rand();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      note sprintf "Sleeping for %.6f seconds...\n", $r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      printf("# Sleeping for %.6f seconds...\n", $r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       Time::HiRes::sleep($r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +64,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     skip "no clock_getres", 1 unless &Time::HiRes::d_clock_getres;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $tr = Time::HiRes::clock_getres();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $tr > 0 or note "tr = $tr";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $tr > 0 or print("# tr = $tr\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -73,17 +73,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $s = 1.5e9;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $t = Time::HiRes::clock_nanosleep(&CLOCK_REALTIME, $s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $r = abs(1 - $t / $s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $r < 2 * $limit or note "t = $t, r = $r";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $r < 2 * $limit or print("# t = $t, r = $r\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     skip "no clock", 1 unless &Time::HiRes::d_clock;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my @clock = Time::HiRes::clock();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "clock = @clock";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# clock = @clock\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for my $i (1..3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (my $j = 0; $j < 1e6; $j++) { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   push @clock, Time::HiRes::clock();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "clock = @clock";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# clock = @clock\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok $clock[0] >= 0 &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $clock[1] > $clock[0] &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/gettimeofday.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/gettimeofday.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,26 +8,26 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my @one = Time::HiRes::gettimeofday();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note 'gettimeofday returned ', 0+@one, ' args';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# gettimeofday returned %d args\n", 0+@one);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ok @one == 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ok $one[0] > 850_000_000 or note "@one too small";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ok $one[0] > 850_000_000 or print("# @one too small\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sleep 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my @two = Time::HiRes::gettimeofday();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ok $two[0] > $one[0] || ($two[0] == $one[0] && $two[1] > $one[1])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  or note "@two is not greater than @one";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  or print("# @two is not greater than @one\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $f = Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ok $f > 850_000_000 or note "$f too small";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ok $f - $two[0] < 2 or note "$f - $two[0] >= 2";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ok $f > 850_000_000 or print("# $f too small\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ok $f - $two[0] < 2 or print("# $f - $two[0] >= 2\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $r = [Time::HiRes::gettimeofday()];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $g = Time::HiRes::tv_interval $r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ok $g < 2 or note $g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ok $g < 2 or print("# $g\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/itimer.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/itimer.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -25,7 +25,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $limit = 0.25; # 25% is acceptable slosh for testing timers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -35,11 +35,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $SIG{VTALRM} = sub {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $i ? $i-- : Time::HiRes::setitimer(&Time::HiRes::ITIMER_VIRTUAL, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "Tick! $i ", Time::HiRes::tv_interval($r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("# Tick! $i %s\n", Time::HiRes::tv_interval($r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };        
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note "setitimer: ", join(" ",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    Time::HiRes::setitimer(&Time::HiRes::ITIMER_VIRTUAL, 0.5, 0.4));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# setitimer: %s\n", join(" ",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       Time::HiRes::setitimer(&Time::HiRes::ITIMER_VIRTUAL, 0.5, 0.4)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Assume interval timer granularity of $limit * 0.5 seconds.  Too bold?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $virt = Time::HiRes::getitimer(&Time::HiRes::ITIMER_VIRTUAL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -47,19 +47,19 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    "ITIMER_VIRTUAL defined with sufficient granularity")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    or diag "virt=" . (defined $virt ? $virt : 'undef');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note "getitimer: ", join(" ",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    Time::HiRes::getitimer(&Time::HiRes::ITIMER_VIRTUAL));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# getitimer: %s\n", join(" ",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       Time::HiRes::getitimer(&Time::HiRes::ITIMER_VIRTUAL)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while (Time::HiRes::getitimer(&Time::HiRes::ITIMER_VIRTUAL)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (1..1000) { $j++ } # Can't be unbreakable, must test getitimer().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note "getitimer: ", join(" ",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    Time::HiRes::getitimer(&Time::HiRes::ITIMER_VIRTUAL));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++printf("# getitimer: %s\n", join(" ",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       Time::HiRes::getitimer(&Time::HiRes::ITIMER_VIRTUAL)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $virt = Time::HiRes::getitimer(&Time::HiRes::ITIMER_VIRTUAL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note "at end, i=$i";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print("# at end, i=$i\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ is($virt, 0, "time left should be zero");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $SIG{VTALRM} = 'DEFAULT';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/nanosleep.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/nanosleep.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,7 +8,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ eval { Time::HiRes::nanosleep(-5) };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -21,7 +21,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Time::HiRes::nanosleep(10_000_000);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $three = CORE::time;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ok $one == $two || $two == $three
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    or note "slept too long, $one $two $three";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    or print("# slept too long, $one $two $three\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     skip "no gettimeofday", 1 unless &Time::HiRes::d_gettimeofday;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -29,7 +29,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Time::HiRes::nanosleep(500_000_000);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $f2 = Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $d = $f2 - $f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $d > 0.4 && $d < 0.9 or note "slept $d secs $f to $f2";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $d > 0.4 && $d < 0.9 or print("# slept $d secs $f to $f2\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/sleep.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/sleep.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use strict;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BEGIN { require_ok "Time::HiRes"; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -26,12 +26,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     skip "no subsecond alarm", 2 unless $can_subsecond_alarm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $f = Time::HiRes::time; 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "time...$f";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# time...$f\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $r = [Time::HiRes::gettimeofday()];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Time::HiRes::sleep (0.5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "sleep...", Time::HiRes::tv_interval($r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("# sleep...%s\n", Time::HiRes::tv_interval($r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/stat.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/stat.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -13,7 +13,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 43;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 43;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my @atime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,8 +42,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     is_deeply $lstat, $stat;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 while unlink $$;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note "mtime = @mtime";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note "atime = @atime";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print("# mtime = @mtime\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print("# atime = @atime\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $ai = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $mi = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $ss = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -63,7 +63,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $ss++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-note "ai = $ai, mi = $mi, ss = $ss";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print("# ai = $ai, mi = $mi, ss = $ss\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Need at least 75% of monotonical increase and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # 20% of subsecond results. Yes, this is guessing.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/time.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/time.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use strict;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BEGIN { require_ok "Time::HiRes"; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -16,8 +16,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # (CORE::time() may be rounding down, up, or closest),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # but allow 10% of slop.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok abs($s) / $n <= 1.10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  or note "Time::HiRes::time() not close to CORE::time()";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "s = $s, n = $n, s/n = ", abs($s)/$n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  or print("# Time::HiRes::time() not close to CORE::time()\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("# s = $s, n = $n, s/n = %s\n", abs($s)/$n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/tv_interval.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/tv_interval.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,10 +1,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use strict;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BEGIN { require_ok "Time::HiRes"; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $f = Time::HiRes::tv_interval [5, 100_000], [10, 500_000];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ok abs($f - 5.4) < 0.001 or note $f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ok abs($f - 5.4) < 0.001 or print("# $f\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/ualarm.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/ualarm.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,7 +8,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 12;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 12;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use Config;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -24,13 +24,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $tick = 0; Time::HiRes::ualarm(10_000); while ($tick == 0) { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $three = CORE::time;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok $one == $two || $two == $three
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  or note "slept too long, $one $two $three";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "tick = $tick, one = $one, two = $two, three = $three";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  or print("# slept too long, $one $two $three\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# tick = $tick, one = $one, two = $two, three = $three\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $tick = 0; Time::HiRes::ualarm(10_000, 10_000); while ($tick < 3) { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Time::HiRes::ualarm(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "tick = $tick, one = $one, two = $two, three = $three";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# tick = $tick, one = $one, two = $two, three = $three\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ eval { Time::HiRes::ualarm(-4) };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -59,24 +59,24 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $alarmed = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   local $SIG{ ALRM } = sub { $alarmed++ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $t0 = Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "t0 = $t0";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "ualarm($n)";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# t0 = $t0\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# ualarm($n)\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Time::HiRes::ualarm($n); 1 while $alarmed == 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $t1 = Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "t1 = $t1";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# t1 = $t1\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $dt = $t1 - $t0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "dt = $dt";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# dt = $dt\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $r = $dt / ($n/1e6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note "r = $r";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  print("# r = $r\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $ok =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ($n < 1_000_000 || # Too much noise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ($r >= 0.8 && $r <= 1.6));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   last if $ok;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   my $nap = bellish(3, 15);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  note sprintf "Retrying in %.1f seconds...\n", $nap;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  printf("# Retrying in %.1f seconds...\n", $nap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Time::HiRes::sleep($nap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $ok or note "ualarm($n) close enough";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $ok or print("# ualarm($n) close enough\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -93,12 +93,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } while $t1 - $t0 <= 0.3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $got1 = Time::HiRes::ualarm(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "t0 = $t0";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "got0 = $got0";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "t1 = $t1";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "t1 - t0 = ", ($t1 - $t0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    note "got1 = $got1";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $got0 == 0 or note $got0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# t0 = $t0\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# got0 = $got0\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# t1 = $t1\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("# t1 - t0 = %s\n", ($t1 - $t0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    print("# got1 = $got1\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $got0 == 0 or print("# $got0\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   skip "alarm interval exceeded", 2 if $t1 - $t0 >= 0.5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ok $got1 > 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -106,7 +106,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ok $got1 < 300_000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $got2 = Time::HiRes::ualarm(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $got2 == 0 or note $got2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $got2 == 0 or print("# $got2\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/usleep.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/usleep.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,7 +8,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-use Test::More 0.82 tests => 6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ eval { Time::HiRes::usleep(-2) };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -23,7 +23,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Time::HiRes::usleep(10_000);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ my $three = CORE::time;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ok $one == $two || $two == $three
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-or note "slept too long, $one $two $three";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++or print("# slept too long, $one $two $three\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     skip "no gettimeofday", 1 unless &Time::HiRes::d_gettimeofday;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -31,7 +31,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Time::HiRes::usleep(500_000);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $f2 = Time::HiRes::time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $d = $f2 - $f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $d > 0.4 && $d < 0.9 or note "slept $d secs $f to $f2";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $d > 0.4 && $d < 0.9 or print("# slept $d secs $f to $f2\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,7 +39,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $r = [ Time::HiRes::gettimeofday() ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Time::HiRes::sleep( 0.5 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     my $f = Time::HiRes::tv_interval $r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ok $f > 0.4 && $f < 0.9 or note "slept $f instead of 0.5 secs.";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ok $f > 0.4 && $f < 0.9 or print("# slept $f instead of 0.5 secs.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -59,7 +59,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   skip $msg, 1 unless $td < $sleep * (1 + $limit);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ok $a < $limit or note $msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ok $a < $limit or print("# $msg\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     $t0 = Time::HiRes::gettimeofday();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -71,7 +71,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     SKIP: {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   skip $msg, 1 unless $td < $sleep * (1 + $limit);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ok $a < $limit or note $msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ok $a < $limit or print("# $msg\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- dist/Time-HiRes/t/utime.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ dist/Time-HiRes/t/utime.t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,101 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use strict;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++BEGIN {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    require Time::HiRes;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    require Test::More;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unless(&Time::HiRes::d_hires_utime) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Test::More::plan(skip_all => "no hires_utime");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unless (&Time::HiRes::d_futimens) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Test::More::plan(skip_all => "no futimens()");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unless (&Time::HiRes::d_utimensat) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Test::More::plan(skip_all => "no utimensat()");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ($^O eq 'gnukfreebsd') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Test::More::plan(skip_all => "futimens() and utimensat() not working in $^O");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Test::More tests => 18;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use t::Watchdog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use File::Temp qw( tempfile );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++use Config;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Cygwin timestamps have less precision.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++my $atime = $^O eq 'cygwin' ? 1.1111111 : 1.111111111;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++my $mtime = $^O eq 'cygwin' ? 2.2222222 : 2.222222222;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print "# utime \$fh\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is Time::HiRes::utime($atime, $mtime, $fh), 1, "One file changed";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename) )[8, 9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is $got_atime, $atime, "atime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is $got_mtime, $mtime, "mtime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print "#utime \$filename\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is Time::HiRes::utime($atime, $mtime, $filename), 1, "One file changed";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh) )[8, 9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is $got_atime, $atime, "atime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is $got_mtime, $mtime, "mtime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print "utime \$filename and \$fh\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($fh1, $filename1) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($fh2, $filename2) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is Time::HiRes::utime($atime, $mtime, $filename1, $fh2), 2, "Two files changed";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh1) )[8, 9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          is $got_atime, $atime, "File 1 atime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          is $got_mtime, $mtime, "File 1 mtime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename2) )[8, 9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          is $got_atime, $atime, "File 2 atime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          is $got_mtime, $mtime, "File 2 mtime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print "# utime undef sets time to now\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($fh1, $filename1) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my ($fh2, $filename2) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  my $now = Time::HiRes::time;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  is Time::HiRes::utime(undef, undef, $filename1, $fh2), 2, "Two files changed";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh1) )[8, 9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          cmp_ok abs( $got_atime - $now), '<', 0.1, "File 1 atime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          cmp_ok abs( $got_mtime - $now), '<', 0.1, "File 1 mtime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename2) )[8, 9];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          cmp_ok abs( $got_atime - $now), '<', 0.1, "File 2 atime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          cmp_ok abs( $got_mtime - $now), '<', 0.1, "File 2 mtime set correctly";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print "# negative atime dies\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  eval { Time::HiRes::utime(-4, $mtime) };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  like $@, qr/::utime\(-4, 2\.22222\): negative time not invented yet/,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          "negative time error";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++print "# negative mtime dies;\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  eval { Time::HiRes::utime($atime, -4) };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  like $@, qr/::utime\(1.11111, -4\): negative time not invented yet/,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          "negative time error";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++done_testing;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1;
</span></pre><pre style='margin:0'>

</pre>