perl-Time-HiRes/Time-HiRes-1.9760-Upgrade-t...

5432 lines
168 KiB
Diff

From 8ee999ad66e2b3c8b4ca87a543c081fc248719d5 Mon Sep 17 00:00:00 2001
From: Jitka Plesnikova <jplesnik@redhat.com>
Date: Tue, 21 Apr 2020 10:24:17 +0200
Subject: [PATCH] Upgrade to 1.9764
---
HiRes.pm | 141 ++--
HiRes.xs | 1721 ++++++++++++++++++++++++----------------------
Makefile.PL | 689 +++++++++----------
t/Watchdog.pm | 54 +-
t/alarm.t | 204 +++---
t/clock.t | 62 +-
t/gettimeofday.t | 6 +-
t/itimer.t | 18 +-
t/nanosleep.t | 6 +-
t/sleep.t | 6 +-
t/stat.t | 20 +-
t/time.t | 6 +-
t/ualarm.t | 60 +-
t/usleep.t | 14 +-
t/utime.t | 304 ++++----
typemap | 454 ++++++------
16 files changed, 1891 insertions(+), 1874 deletions(-)
diff --git a/HiRes.pm b/HiRes.pm
index 08eefc8..433ca31 100644
--- a/HiRes.pm
+++ b/HiRes.pm
@@ -11,46 +11,46 @@ our @ISA = qw(Exporter);
our @EXPORT = qw( );
# More or less this same list is in Makefile.PL. Should unify.
our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
- getitimer setitimer nanosleep clock_gettime clock_getres
- clock clock_nanosleep
- CLOCKS_PER_SEC
- CLOCK_BOOTTIME
- CLOCK_HIGHRES
- CLOCK_MONOTONIC
- CLOCK_MONOTONIC_COARSE
- CLOCK_MONOTONIC_FAST
- CLOCK_MONOTONIC_PRECISE
- CLOCK_MONOTONIC_RAW
- CLOCK_PROCESS_CPUTIME_ID
- CLOCK_PROF
- CLOCK_REALTIME
- CLOCK_REALTIME_COARSE
- CLOCK_REALTIME_FAST
- CLOCK_REALTIME_PRECISE
- CLOCK_REALTIME_RAW
- CLOCK_SECOND
- CLOCK_SOFTTIME
- CLOCK_THREAD_CPUTIME_ID
- CLOCK_TIMEOFDAY
- CLOCK_UPTIME
- CLOCK_UPTIME_COARSE
- CLOCK_UPTIME_FAST
- CLOCK_UPTIME_PRECISE
- CLOCK_UPTIME_RAW
- CLOCK_VIRTUAL
- ITIMER_PROF
- ITIMER_REAL
- ITIMER_REALPROF
- ITIMER_VIRTUAL
- TIMER_ABSTIME
- d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
- d_nanosleep d_clock_gettime d_clock_getres
- d_clock d_clock_nanosleep d_hires_stat
- d_futimens d_utimensat d_hires_utime
- stat lstat utime
- );
-
-our $VERSION = '1.9760';
+ getitimer setitimer nanosleep clock_gettime clock_getres
+ clock clock_nanosleep
+ CLOCKS_PER_SEC
+ CLOCK_BOOTTIME
+ CLOCK_HIGHRES
+ CLOCK_MONOTONIC
+ CLOCK_MONOTONIC_COARSE
+ CLOCK_MONOTONIC_FAST
+ CLOCK_MONOTONIC_PRECISE
+ CLOCK_MONOTONIC_RAW
+ CLOCK_PROCESS_CPUTIME_ID
+ CLOCK_PROF
+ CLOCK_REALTIME
+ CLOCK_REALTIME_COARSE
+ CLOCK_REALTIME_FAST
+ CLOCK_REALTIME_PRECISE
+ CLOCK_REALTIME_RAW
+ CLOCK_SECOND
+ CLOCK_SOFTTIME
+ CLOCK_THREAD_CPUTIME_ID
+ CLOCK_TIMEOFDAY
+ CLOCK_UPTIME
+ CLOCK_UPTIME_COARSE
+ CLOCK_UPTIME_FAST
+ CLOCK_UPTIME_PRECISE
+ CLOCK_UPTIME_RAW
+ CLOCK_VIRTUAL
+ ITIMER_PROF
+ ITIMER_REAL
+ ITIMER_REALPROF
+ ITIMER_VIRTUAL
+ TIMER_ABSTIME
+ d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
+ d_nanosleep d_clock_gettime d_clock_getres
+ d_clock d_clock_nanosleep d_hires_stat
+ d_futimens d_utimensat d_hires_utime
+ stat lstat utime
+ );
+
+our $VERSION = '1.9764';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
@@ -67,8 +67,8 @@ sub AUTOLOAD {
die "$error at $file line $line.\n";
}
{
- no strict 'refs';
- *$AUTOLOAD = sub { $val };
+ no strict 'refs';
+ *$AUTOLOAD = sub { $val };
}
goto &$AUTOLOAD;
}
@@ -76,17 +76,17 @@ sub AUTOLOAD {
sub import {
my $this = shift;
for my $i (@_) {
- if (($i eq 'clock_getres' && !&d_clock_getres) ||
- ($i eq 'clock_gettime' && !&d_clock_gettime) ||
- ($i eq 'clock_nanosleep' && !&d_clock_nanosleep) ||
- ($i eq 'clock' && !&d_clock) ||
- ($i eq 'nanosleep' && !&d_nanosleep) ||
- ($i eq 'usleep' && !&d_usleep) ||
- ($i eq 'utime' && !&d_hires_utime) ||
- ($i eq 'ualarm' && !&d_ualarm)) {
- require Carp;
- Carp::croak("Time::HiRes::$i(): unimplemented in this platform");
- }
+ if (($i eq 'clock_getres' && !&d_clock_getres) ||
+ ($i eq 'clock_gettime' && !&d_clock_gettime) ||
+ ($i eq 'clock_nanosleep' && !&d_clock_nanosleep) ||
+ ($i eq 'clock' && !&d_clock) ||
+ ($i eq 'nanosleep' && !&d_nanosleep) ||
+ ($i eq 'usleep' && !&d_usleep) ||
+ ($i eq 'utime' && !&d_hires_utime) ||
+ ($i eq 'ualarm' && !&d_ualarm)) {
+ require Carp;
+ Carp::croak("Time::HiRes::$i(): unimplemented in this platform");
+ }
}
Time::HiRes->export_to_level(1, $this, @_);
}
@@ -114,7 +114,7 @@ Time::HiRes - High resolution alarm, sleep, gettimeofday, interval timers
=head1 SYNOPSIS
use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep
- clock_gettime clock_getres clock_nanosleep clock
+ clock_gettime clock_getres clock_nanosleep clock
stat lstat utime);
usleep ($microseconds);
@@ -143,7 +143,7 @@ Time::HiRes - High resolution alarm, sleep, gettimeofday, interval timers
getitimer ($which);
use Time::HiRes qw( clock_gettime clock_getres clock_nanosleep
- ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF
+ ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF
ITIMER_REALPROF );
$realtime = clock_gettime(CLOCK_REALTIME);
@@ -221,8 +221,8 @@ Sleeps for the number of microseconds (millionths of a second)
specified. Returns the number of microseconds actually slept.
Can sleep for more than one second, unlike the C<usleep> system call.
Can also sleep for zero seconds, which often works like a I<thread yield>.
-See also C<Time::HiRes::usleep()>, C<Time::HiRes::sleep()>, and
-C<Time::HiRes::clock_nanosleep()>.
+See also L<C<Time::HiRes::sleep()>|/sleep ( $floating_seconds )>, and
+L<C<clock_nanosleep()>|/clock_nanosleep ( $which, $nanoseconds, $flags = 0)>.
Do not expect usleep() to be exact down to one microsecond.
@@ -232,8 +232,10 @@ Sleeps for the number of nanoseconds (1e9ths of a second) specified.
Returns the number of nanoseconds actually slept (accurate only to
microseconds, the nearest thousand of them). Can sleep for more than
one second. Can also sleep for zero seconds, which often works like
-a I<thread yield>. See also C<Time::HiRes::sleep()>,
-C<Time::HiRes::usleep()>, and C<Time::HiRes::clock_nanosleep()>.
+a I<thread yield>. See also
+L<C<Time::HiRes::sleep()>|/sleep ( $floating_seconds )>,
+L<C<Time::HiRes::usleep()>|/usleep ( $useconds )>, and
+L<C<clock_nanosleep()>|/clock_nanosleep ( $which, $nanoseconds, $flags = 0)>.
Do not expect nanosleep() to be exact down to one nanosecond.
Getting even accuracy of one thousand nanoseconds is good.
@@ -250,7 +252,7 @@ ualarm(0) will cancel an outstanding ualarm().
Note that the interaction between alarms and sleeps is unspecified.
-=item tv_interval
+=item tv_interval
tv_interval ( $ref_to_gettimeofday [, $ref_to_later_gettimeofday] )
@@ -356,7 +358,7 @@ delivered when the timer expires. C<SIGPROF> can interrupt system calls.
The semantics of interval timers for multithreaded programs are
system-specific, and some systems may support additional interval
timers. For example, it is unspecified which thread gets the signals.
-See your C<setitimer()> documentation.
+See your L<C<setitimer(2)>> documentation.
=item getitimer ( $which )
@@ -404,8 +406,10 @@ default to zero but C<TIMER_ABSTIME> can specified (must be exported
explicitly) which means that C<$nanoseconds> is not a time interval
(as is the default) but instead an absolute time. Can sleep for more
than one second. Can also sleep for zero seconds, which often works
-like a I<thread yield>. See also C<Time::HiRes::sleep()>,
-C<Time::HiRes::usleep()>, and C<Time::HiRes::nanosleep()>.
+like a I<thread yield>. See also
+L<C<Time::HiRes::sleep()>|/sleep ( $floating_seconds )>,
+L<C<Time::HiRes::usleep()>|/usleep ( $useconds )>, and
+L<C<Time::HiRes::nanosleep()>|/nanosleep ( $nanoseconds )>.
Do not expect clock_nanosleep() to be exact down to one nanosecond.
Getting even accuracy of one thousand nanoseconds is good.
@@ -515,7 +519,7 @@ Returns the number of files successfully changed.
# get seconds and microseconds since the epoch
($s, $usec) = gettimeofday();
- # measure elapsed time
+ # measure elapsed time
# (could also do by subtracting 2 gettimeofday return values)
$t0 = [gettimeofday];
# do bunch of stuff here
@@ -524,7 +528,7 @@ Returns the number of files successfully changed.
$t0_t1 = tv_interval $t0, $t1;
$elapsed = tv_interval ($t0, [gettimeofday]);
- $elapsed = tv_interval ($t0); # equivalent code
+ $elapsed = tv_interval ($t0); # equivalent code
#
# replacements for time, alarm and sleep that know about
@@ -650,9 +654,10 @@ gnukfreebsd seems to have non-functional futimens() and utimensat()
Perl modules L<BSD::Resource>, L<Time::TAI64>.
-Your system documentation for C<clock>, C<clock_gettime>,
-C<clock_getres>, C<clock_nanosleep>, C<clock_settime>, C<getitimer>,
-C<gettimeofday>, C<setitimer>, C<sleep>, C<stat>, C<ualarm>.
+Your system documentation for L<C<clock(3)>>, L<C<clock_gettime(2)>>,
+L<C<clock_getres(3)>>, L<C<clock_nanosleep(3)>>, L<C<clock_settime(2)>>,
+L<C<getitimer(2)>>, L<C<gettimeofday(2)>>, L<C<setitimer(2)>>, L<C<sleep(3)>>,
+L<C<stat(2)>>, L<C<ualarm(3)>>.
=head1 AUTHORS
diff --git a/HiRes.xs b/HiRes.xs
index 97e870c..8002472 100644
--- a/HiRes.xs
+++ b/HiRes.xs
@@ -1,12 +1,12 @@
/*
- *
+ *
* Copyright (c) 1996-2002 Douglas E. Wegscheid. All rights reserved.
- *
+ *
* Copyright (c) 2002-2010 Jarkko Hietaniemi.
* All rights reserved.
*
* Copyright (C) 2011, 2012, 2013 Andrew Main (Zefram) <zefram@fysh.org>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the same terms as Perl itself.
*/
@@ -22,21 +22,21 @@ extern "C" {
# include "ppport.h"
#endif
#if defined(__CYGWIN__) && defined(HAS_W32API_WINDOWS_H)
-# include <w32api/windows.h>
-# define CYGWIN_WITH_W32API
+# include <w32api/windows.h>
+# define CYGWIN_WITH_W32API
#endif
#ifdef WIN32
-# include <time.h>
+# include <time.h>
#else
-# include <sys/time.h>
+# include <sys/time.h>
#endif
#ifdef HAS_SELECT
-# ifdef I_SYS_SELECT
-# include <sys/select.h>
-# endif
+# ifdef I_SYS_SELECT
+# include <sys/select.h>
+# endif
#endif
#if defined(TIME_HIRES_CLOCK_GETTIME_SYSCALL) || defined(TIME_HIRES_CLOCK_GETRES_SYSCALL)
-#include <syscall.h>
+# include <syscall.h>
#endif
#ifdef __cplusplus
}
@@ -44,29 +44,22 @@ extern "C" {
#define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
#define PERL_DECIMAL_VERSION \
- PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
+ PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
#define PERL_VERSION_GE(r,v,s) \
- (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))
+ (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))
#ifndef GCC_DIAG_IGNORE
-# define GCC_DIAG_IGNORE(x)
-# define GCC_DIAG_RESTORE
+# define GCC_DIAG_IGNORE(x)
+# define GCC_DIAG_RESTORE
#endif
#ifndef GCC_DIAG_IGNORE_STMT
-# define GCC_DIAG_IGNORE_STMT(x) GCC_DIAG_IGNORE(x) NOOP
-# define GCC_DIAG_RESTORE_STMT GCC_DIAG_RESTORE NOOP
-#endif
-
-/* At least ppport.h 3.13 gets this wrong: one really cannot
- * have NVgf as anything else than "g" under Perl 5.6.x. */
-#if PERL_REVISION == 5 && PERL_VERSION == 6
-# undef NVgf
-# define NVgf "g"
+# define GCC_DIAG_IGNORE_STMT(x) GCC_DIAG_IGNORE(x) NOOP
+# define GCC_DIAG_RESTORE_STMT GCC_DIAG_RESTORE NOOP
#endif
#if PERL_VERSION_GE(5,7,3) && !PERL_VERSION_GE(5,10,1)
-# undef SAVEOP
-# define SAVEOP() SAVEVPTR(PL_op)
+# undef SAVEOP
+# define SAVEOP() SAVEVPTR(PL_op)
#endif
#define IV_1E6 1000000
@@ -78,14 +71,14 @@ extern "C" {
#define NV_1E9 1000000000.0
#ifndef PerlProc_pause
-# define PerlProc_pause() Pause()
+# define PerlProc_pause() Pause()
#endif
#ifdef HAS_PAUSE
-# define Pause pause
+# define Pause pause
#else
-# undef Pause /* In case perl.h did it already. */
-# define Pause() sleep(~0) /* Zzz for a long time. */
+# undef Pause /* In case perl.h did it already. */
+# define Pause() sleep(~0) /* Zzz for a long time. */
#endif
/* Though the cpp define ITIMER_VIRTUAL is available the functionality
@@ -93,9 +86,9 @@ extern "C" {
* Neither are ITIMER_PROF or ITIMER_REALPROF implemented. --jhi
*/
#if defined(__CYGWIN__) || defined(WIN32)
-# undef ITIMER_VIRTUAL
-# undef ITIMER_PROF
-# undef ITIMER_REALPROF
+# undef ITIMER_VIRTUAL
+# undef ITIMER_PROF
+# undef ITIMER_REALPROF
#endif
#ifndef TIME_HIRES_CLOCKID_T
@@ -106,37 +99,37 @@ typedef int clockid_t;
/* HP-UX has CLOCK_XXX values but as enums, not as defines.
* The only way to detect these would be to test compile for each. */
-# ifdef __hpux
+# ifdef __hpux
/* However, it seems that at least in HP-UX 11.31 ia64 there *are*
* defines for these, so let's try detecting them. */
-# ifndef CLOCK_REALTIME
-# define CLOCK_REALTIME CLOCK_REALTIME
-# define CLOCK_VIRTUAL CLOCK_VIRTUAL
-# define CLOCK_PROFILE CLOCK_PROFILE
-# endif
-# endif /* # ifdef __hpux */
+# ifndef CLOCK_REALTIME
+# define CLOCK_REALTIME CLOCK_REALTIME
+# define CLOCK_VIRTUAL CLOCK_VIRTUAL
+# define CLOCK_PROFILE CLOCK_PROFILE
+# endif
+# endif /* # ifdef __hpux */
#endif /* #if defined(TIME_HIRES_CLOCK_GETTIME) && defined(_STRUCT_ITIMERSPEC) */
#if defined(WIN32) || defined(CYGWIN_WITH_W32API)
-#ifndef HAS_GETTIMEOFDAY
-# define HAS_GETTIMEOFDAY
-#endif
+# ifndef HAS_GETTIMEOFDAY
+# define HAS_GETTIMEOFDAY
+# endif
/* shows up in winsock.h?
struct timeval {
- long tv_sec;
- long tv_usec;
+ long tv_sec;
+ long tv_usec;
}
*/
typedef union {
- unsigned __int64 ft_i64;
- FILETIME ft_val;
+ unsigned __int64 ft_i64;
+ FILETIME ft_val;
} FT_t;
-#define MY_CXT_KEY "Time::HiRes_" XS_VERSION
+# define MY_CXT_KEY "Time::HiRes_" XS_VERSION
typedef struct {
unsigned long run_count;
@@ -146,27 +139,35 @@ typedef struct {
unsigned __int64 reset_time;
} my_cxt_t;
+/* Visual C++ 2013 and older don't have the timespec structure */
+# if defined(_MSC_VER) && _MSC_VER < 1900
+struct timespec {
+ time_t tv_sec;
+ long tv_nsec;
+};
+# endif
+
START_MY_CXT
/* Number of 100 nanosecond units from 1/1/1601 to 1/1/1970 */
-#ifdef __GNUC__
-# define Const64(x) x##LL
-#else
-# define Const64(x) x##i64
-#endif
-#define EPOCH_BIAS Const64(116444736000000000)
-
-#ifdef Const64
-# ifdef __GNUC__
-# define IV_1E6LL 1000000LL /* Needed because of Const64() ##-appends LL (or i64). */
-# define IV_1E7LL 10000000LL
-# define IV_1E9LL 1000000000LL
-# else
-# define IV_1E6i64 1000000i64
-# define IV_1E7i64 10000000i64
-# define IV_1E9i64 1000000000i64
-# endif
-#endif
+# ifdef __GNUC__
+# define Const64(x) x##LL
+# else
+# define Const64(x) x##i64
+# endif
+# define EPOCH_BIAS Const64(116444736000000000)
+
+# ifdef Const64
+# ifdef __GNUC__
+# define IV_1E6LL 1000000LL /* Needed because of Const64() ##-appends LL (or i64). */
+# define IV_1E7LL 10000000LL
+# define IV_1E9LL 1000000000LL
+# else
+# define IV_1E6i64 1000000i64
+# define IV_1E7i64 10000000i64
+# define IV_1E9i64 1000000000i64
+# endif
+# endif
/* NOTE: This does not compute the timezone info (doing so can be expensive,
* and appears to be unsupported even by glibc) */
@@ -174,50 +175,82 @@ START_MY_CXT
/* dMY_CXT needs a Perl context and we don't want to call PERL_GET_CONTEXT
for performance reasons */
-#undef gettimeofday
-#define gettimeofday(tp, not_used) _gettimeofday(aTHX_ tp, not_used)
+# undef gettimeofday
+# define gettimeofday(tp, not_used) _gettimeofday(aTHX_ tp, not_used)
+
+# undef GetSystemTimePreciseAsFileTime
+# define GetSystemTimePreciseAsFileTime(out) _GetSystemTimePreciseAsFileTime(aTHX_ out)
+
+# undef clock_gettime
+# define clock_gettime(clock_id, tp) _clock_gettime(aTHX_ clock_id, tp)
+
+# undef clock_getres
+# define clock_getres(clock_id, tp) _clock_getres(clock_id, tp)
+
+# ifndef CLOCK_REALTIME
+# define CLOCK_REALTIME 1
+# define CLOCK_MONOTONIC 2
+# endif
/* If the performance counter delta drifts more than 0.5 seconds from the
* system time then we recalibrate to the system time. This means we may
* move *backwards* in time! */
-#define MAX_PERF_COUNTER_SKEW Const64(5000000) /* 0.5 seconds */
+# define MAX_PERF_COUNTER_SKEW Const64(5000000) /* 0.5 seconds */
/* Reset reading from the performance counter every five minutes.
* Many PC clocks just seem to be so bad. */
-#define MAX_PERF_COUNTER_TICKS Const64(300000000) /* 300 seconds */
+# define MAX_PERF_COUNTER_TICKS Const64(300000000) /* 300 seconds */
-static int
-_gettimeofday(pTHX_ struct timeval *tp, void *not_used)
+/*
+ * Windows 8 introduced GetSystemTimePreciseAsFileTime(), but currently we have
+ * to support older systems, so for now we provide our own implementation.
+ * In the future we will switch to the real deal.
+ */
+static void
+_GetSystemTimePreciseAsFileTime(pTHX_ FILETIME *out)
{
dMY_CXT;
-
- unsigned __int64 ticks;
FT_t ft;
- PERL_UNUSED_ARG(not_used);
if (MY_CXT.run_count++ == 0 ||
- MY_CXT.base_systime_as_filetime.ft_i64 > MY_CXT.reset_time) {
+ MY_CXT.base_systime_as_filetime.ft_i64 > MY_CXT.reset_time) {
+
QueryPerformanceFrequency((LARGE_INTEGER*)&MY_CXT.tick_frequency);
QueryPerformanceCounter((LARGE_INTEGER*)&MY_CXT.base_ticks);
GetSystemTimeAsFileTime(&MY_CXT.base_systime_as_filetime.ft_val);
ft.ft_i64 = MY_CXT.base_systime_as_filetime.ft_i64;
- MY_CXT.reset_time = ft.ft_i64 + MAX_PERF_COUNTER_TICKS;
+ MY_CXT.reset_time = ft.ft_i64 + MAX_PERF_COUNTER_TICKS;
}
else {
- __int64 diff;
+ __int64 diff;
+ unsigned __int64 ticks;
QueryPerformanceCounter((LARGE_INTEGER*)&ticks);
ticks -= MY_CXT.base_ticks;
ft.ft_i64 = MY_CXT.base_systime_as_filetime.ft_i64
+ Const64(IV_1E7) * (ticks / MY_CXT.tick_frequency)
+(Const64(IV_1E7) * (ticks % MY_CXT.tick_frequency)) / MY_CXT.tick_frequency;
- diff = ft.ft_i64 - MY_CXT.base_systime_as_filetime.ft_i64;
- if (diff < -MAX_PERF_COUNTER_SKEW || diff > MAX_PERF_COUNTER_SKEW) {
- MY_CXT.base_ticks += ticks;
+ diff = ft.ft_i64 - MY_CXT.base_systime_as_filetime.ft_i64;
+ if (diff < -MAX_PERF_COUNTER_SKEW || diff > MAX_PERF_COUNTER_SKEW) {
+ MY_CXT.base_ticks += ticks;
GetSystemTimeAsFileTime(&MY_CXT.base_systime_as_filetime.ft_val);
ft.ft_i64 = MY_CXT.base_systime_as_filetime.ft_i64;
- }
+ }
}
+ *out = ft.ft_val;
+
+ return;
+}
+
+static int
+_gettimeofday(pTHX_ struct timeval *tp, void *not_used)
+{
+ FT_t ft;
+
+ PERL_UNUSED_ARG(not_used);
+
+ GetSystemTimePreciseAsFileTime(&ft.ft_val);
+
/* seconds since epoch */
tp->tv_sec = (long)((ft.ft_i64 - EPOCH_BIAS) / Const64(IV_1E7));
@@ -226,54 +259,107 @@ _gettimeofday(pTHX_ struct timeval *tp, void *not_used)
return 0;
}
-#endif
-#if defined(WIN32) && !defined(ATLEASTFIVEOHOHFIVE)
-static unsigned int
-sleep(unsigned int t)
+static int
+_clock_gettime(pTHX_ clockid_t clock_id, struct timespec *tp)
{
- Sleep(t*1000);
+ FT_t ft;
+
+ switch (clock_id) {
+ case CLOCK_REALTIME: {
+ FT_t ft;
+
+ GetSystemTimePreciseAsFileTime(&ft.ft_val);
+ tp->tv_sec = (time_t)((ft.ft_i64 - EPOCH_BIAS) / IV_1E7);
+ tp->tv_nsec = (long)((ft.ft_i64 % IV_1E7) * 100);
+ break;
+ }
+ case CLOCK_MONOTONIC: {
+ unsigned __int64 freq, ticks;
+
+ QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
+ QueryPerformanceCounter((LARGE_INTEGER*)&ticks);
+
+ tp->tv_sec = (time_t)(ticks / freq);
+ tp->tv_nsec = (long)((IV_1E9 * (ticks % freq)) / freq);
+ break;
+ }
+ default:
+ errno = EINVAL;
+ return 1;
+ }
+
return 0;
}
-#endif
+
+static int
+_clock_getres(clockid_t clock_id, struct timespec *tp)
+{
+ unsigned __int64 freq, qpc_res_ns;
+
+ QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
+ qpc_res_ns = IV_1E9 > freq ? IV_1E9 / freq : 1;
+
+ switch (clock_id) {
+ case CLOCK_REALTIME:
+ tp->tv_sec = 0;
+ /* the resolution can't be smaller than 100ns because our implementation
+ * of CLOCK_REALTIME is using FILETIME internally */
+ tp->tv_nsec = (long)(qpc_res_ns > 100 ? qpc_res_ns : 100);
+ break;
+
+ case CLOCK_MONOTONIC:
+ tp->tv_sec = 0;
+ tp->tv_nsec = (long)qpc_res_ns;
+ break;
+
+ default:
+ errno = EINVAL;
+ return 1;
+ }
+
+ return 0;
+}
+
+#endif /* #if defined(WIN32) || defined(CYGWIN_WITH_W32API) */
#if !defined(HAS_GETTIMEOFDAY) && defined(VMS)
-#define HAS_GETTIMEOFDAY
-
-#include <lnmdef.h>
-#include <time.h> /* gettimeofday */
-#include <stdlib.h> /* qdiv */
-#include <starlet.h> /* sys$gettim */
-#include <descrip.h>
-#ifdef __VAX
-#include <lib$routines.h> /* lib$ediv() */
-#endif
+# define HAS_GETTIMEOFDAY
+
+# include <lnmdef.h>
+# include <time.h> /* gettimeofday */
+# include <stdlib.h> /* qdiv */
+# include <starlet.h> /* sys$gettim */
+# include <descrip.h>
+# ifdef __VAX
+# include <lib$routines.h> /* lib$ediv() */
+# endif
/*
VMS binary time is expressed in 100 nano-seconds since
system base time which is 17-NOV-1858 00:00:00.00
*/
-#define DIV_100NS_TO_SECS 10000000L
-#define DIV_100NS_TO_USECS 10L
+# define DIV_100NS_TO_SECS 10000000L
+# define DIV_100NS_TO_USECS 10L
-/*
+/*
gettimeofday is supposed to return times since the epoch
so need to determine this in terms of VMS base time
*/
static $DESCRIPTOR(dscepoch,"01-JAN-1970 00:00:00.00");
-#ifdef __VAX
+# ifdef __VAX
static long base_adjust[2]={0L,0L};
-#else
+# else
static __int64 base_adjust=0;
-#endif
+# endif
-/*
+/*
If we don't have gettimeofday, then likely we are on a VMS machine that
operates on local time rather than UTC...so we have to zone-adjust.
- This code gleefully swiped from VMS.C
+ This code gleefully swiped from VMS.C
*/
/* method used to handle UTC conversions:
@@ -282,115 +368,115 @@ static __int64 base_adjust=0;
static int gmtime_emulation_type;
/* number of secs to add to UTC POSIX-style time to get local time */
static long int utc_offset_secs;
-static struct dsc$descriptor_s fildevdsc =
- { 12, DSC$K_DTYPE_T, DSC$K_CLASS_S, "LNM$FILE_DEV" };
+static struct dsc$descriptor_s fildevdsc =
+ { 12, DSC$K_DTYPE_T, DSC$K_CLASS_S, "LNM$FILE_DEV" };
static struct dsc$descriptor_s *fildev[] = { &fildevdsc, NULL };
static time_t toutc_dst(time_t loc) {
- struct tm *rsltmp;
+ struct tm *rsltmp;
- if ((rsltmp = localtime(&loc)) == NULL) return -1;
- loc -= utc_offset_secs;
- if (rsltmp->tm_isdst) loc -= 3600;
- return loc;
+ if ((rsltmp = localtime(&loc)) == NULL) return -1;
+ loc -= utc_offset_secs;
+ if (rsltmp->tm_isdst) loc -= 3600;
+ return loc;
}
static time_t toloc_dst(time_t utc) {
- struct tm *rsltmp;
+ struct tm *rsltmp;
- utc += utc_offset_secs;
- if ((rsltmp = localtime(&utc)) == NULL) return -1;
- if (rsltmp->tm_isdst) utc += 3600;
- return utc;
+ utc += utc_offset_secs;
+ if ((rsltmp = localtime(&utc)) == NULL) return -1;
+ if (rsltmp->tm_isdst) utc += 3600;
+ return utc;
}
-#define _toutc(secs) ((secs) == (time_t) -1 ? (time_t) -1 : \
- ((gmtime_emulation_type || timezone_setup()), \
- (gmtime_emulation_type == 1 ? toutc_dst(secs) : \
- ((secs) - utc_offset_secs))))
+# define _toutc(secs) ((secs) == (time_t) -1 ? (time_t) -1 : \
+ ((gmtime_emulation_type || timezone_setup()), \
+ (gmtime_emulation_type == 1 ? toutc_dst(secs) : \
+ ((secs) - utc_offset_secs))))
-#define _toloc(secs) ((secs) == (time_t) -1 ? (time_t) -1 : \
- ((gmtime_emulation_type || timezone_setup()), \
- (gmtime_emulation_type == 1 ? toloc_dst(secs) : \
- ((secs) + utc_offset_secs))))
+# define _toloc(secs) ((secs) == (time_t) -1 ? (time_t) -1 : \
+ ((gmtime_emulation_type || timezone_setup()), \
+ (gmtime_emulation_type == 1 ? toloc_dst(secs) : \
+ ((secs) + utc_offset_secs))))
static int
-timezone_setup(void)
+timezone_setup(void)
{
- struct tm *tm_p;
-
- if (gmtime_emulation_type == 0) {
- int dstnow;
- time_t base = 15 * 86400; /* 15jan71; to avoid month/year ends between */
- /* results of calls to gmtime() and localtime() */
- /* for same &base */
+ struct tm *tm_p;
- gmtime_emulation_type++;
- if ((tm_p = gmtime(&base)) == NULL) { /* CRTL gmtime() is a fake */
- char off[LNM$C_NAMLENGTH+1];;
+ if (gmtime_emulation_type == 0) {
+ int dstnow;
+ time_t base = 15 * 86400; /* 15jan71; to avoid month/year ends between */
+ /* results of calls to gmtime() and localtime() */
+ /* for same &base */
- gmtime_emulation_type++;
- if (!Perl_vmstrnenv("SYS$TIMEZONE_DIFFERENTIAL",off,0,fildev,0)) {
gmtime_emulation_type++;
- utc_offset_secs = 0;
- Perl_warn(aTHX_ "no UTC offset information; assuming local time is UTC");
- }
- else { utc_offset_secs = atol(off); }
- }
- else { /* We've got a working gmtime() */
- struct tm gmt, local;
-
- gmt = *tm_p;
- tm_p = localtime(&base);
- local = *tm_p;
- utc_offset_secs = (local.tm_mday - gmt.tm_mday) * 86400;
- utc_offset_secs += (local.tm_hour - gmt.tm_hour) * 3600;
- utc_offset_secs += (local.tm_min - gmt.tm_min) * 60;
- utc_offset_secs += (local.tm_sec - gmt.tm_sec);
+ if ((tm_p = gmtime(&base)) == NULL) { /* CRTL gmtime() is a fake */
+ char off[LNM$C_NAMLENGTH+1];;
+
+ gmtime_emulation_type++;
+ if (!Perl_vmstrnenv("SYS$TIMEZONE_DIFFERENTIAL",off,0,fildev,0)) {
+ gmtime_emulation_type++;
+ utc_offset_secs = 0;
+ Perl_warn(aTHX_ "no UTC offset information; assuming local time is UTC");
+ }
+ else { utc_offset_secs = atol(off); }
+ }
+ else { /* We've got a working gmtime() */
+ struct tm gmt, local;
+
+ gmt = *tm_p;
+ tm_p = localtime(&base);
+ local = *tm_p;
+ utc_offset_secs = (local.tm_mday - gmt.tm_mday) * 86400;
+ utc_offset_secs += (local.tm_hour - gmt.tm_hour) * 3600;
+ utc_offset_secs += (local.tm_min - gmt.tm_min) * 60;
+ utc_offset_secs += (local.tm_sec - gmt.tm_sec);
+ }
}
- }
- return 1;
+ return 1;
}
int
gettimeofday (struct timeval *tp, void *tpz)
{
- long ret;
-#ifdef __VAX
- long quad[2];
- long quad1[2];
- long div_100ns_to_secs;
- long div_100ns_to_usecs;
- long quo,rem;
- long quo1,rem1;
-#else
- __int64 quad;
- __qdiv_t ans1,ans2;
-#endif
-/*
+ long ret;
+# ifdef __VAX
+ long quad[2];
+ long quad1[2];
+ long div_100ns_to_secs;
+ long div_100ns_to_usecs;
+ long quo,rem;
+ long quo1,rem1;
+# else
+ __int64 quad;
+ __qdiv_t ans1,ans2;
+# endif
+ /*
In case of error, tv_usec = 0 and tv_sec = VMS condition code.
The return from function is also set to -1.
This is not exactly as per the manual page.
-*/
+ */
- tp->tv_usec = 0;
+ tp->tv_usec = 0;
-#ifdef __VAX
- if (base_adjust[0]==0 && base_adjust[1]==0) {
-#else
- if (base_adjust==0) { /* Need to determine epoch adjustment */
-#endif
+# ifdef __VAX
+ if (base_adjust[0]==0 && base_adjust[1]==0) {
+# else
+ if (base_adjust==0) { /* Need to determine epoch adjustment */
+# endif
ret=sys$bintim(&dscepoch,&base_adjust);
if (1 != (ret &&1)) {
- tp->tv_sec = ret;
- return -1;
+ tp->tv_sec = ret;
+ return -1;
}
- }
+ }
- ret=sys$gettim(&quad); /* Get VMS system time */
- if ((1 && ret) == 1) {
-#ifdef __VAX
+ ret=sys$gettim(&quad); /* Get VMS system time */
+ if ((1 && ret) == 1) {
+# ifdef __VAX
quad[0] -= base_adjust[0]; /* convert to epoch offset */
quad[1] -= base_adjust[1]; /* convert 2nd half of quadword */
div_100ns_to_secs = DIV_100NS_TO_SECS;
@@ -401,27 +487,27 @@ gettimeofday (struct timeval *tp, void *tpz)
lib$ediv(&div_100ns_to_usecs,&quad1,&quo1,&rem1);
tp->tv_sec = quo; /* Whole seconds */
tp->tv_usec = quo1; /* Micro-seconds */
-#else
+# else
quad -= base_adjust; /* convert to epoch offset */
ans1=qdiv(quad,DIV_100NS_TO_SECS);
ans2=qdiv(ans1.rem,DIV_100NS_TO_USECS);
tp->tv_sec = ans1.quot; /* Whole seconds */
tp->tv_usec = ans2.quot; /* Micro-seconds */
-#endif
- } else {
+# endif
+ } else {
tp->tv_sec = ret;
return -1;
- }
-# ifdef VMSISH_TIME
-# ifdef RTL_USES_UTC
- if (VMSISH_TIME) tp->tv_sec = _toloc(tp->tv_sec);
-# else
- if (!VMSISH_TIME) tp->tv_sec = _toutc(tp->tv_sec);
-# endif
-# endif
- return 0;
+ }
+# ifdef VMSISH_TIME
+# ifdef RTL_USES_UTC
+ if (VMSISH_TIME) tp->tv_sec = _toloc(tp->tv_sec);
+# else
+ if (!VMSISH_TIME) tp->tv_sec = _toutc(tp->tv_sec);
+# endif
+# endif
+ return 0;
}
-#endif
+#endif /* #if !defined(HAS_GETTIMEOFDAY) && defined(VMS) */
/* Do not use H A S _ N A N O S L E E P
@@ -430,8 +516,8 @@ gettimeofday (struct timeval *tp, void *tpz)
* (We are part of the core perl now.)
* The TIME_HIRES_NANOSLEEP is set by Makefile.PL. */
#if !defined(HAS_USLEEP) && defined(TIME_HIRES_NANOSLEEP)
-#define HAS_USLEEP
-#define usleep hrt_usleep /* could conflict with ncurses for static build */
+# define HAS_USLEEP
+# define usleep hrt_usleep /* could conflict with ncurses for static build */
static void
hrt_usleep(unsigned long usec) /* This is used to emulate usleep. */
@@ -445,9 +531,9 @@ hrt_usleep(unsigned long usec) /* This is used to emulate usleep. */
#endif /* #if !defined(HAS_USLEEP) && defined(TIME_HIRES_NANOSLEEP) */
#if !defined(HAS_USLEEP) && defined(HAS_SELECT)
-#ifndef SELECT_IS_BROKEN
-#define HAS_USLEEP
-#define usleep hrt_usleep /* could conflict with ncurses for static build */
+# ifndef SELECT_IS_BROKEN
+# define HAS_USLEEP
+# define usleep hrt_usleep /* could conflict with ncurses for static build */
static void
hrt_usleep(unsigned long usec)
@@ -456,14 +542,14 @@ hrt_usleep(unsigned long usec)
tv.tv_sec = 0;
tv.tv_usec = usec;
select(0, (Select_fd_set_t)NULL, (Select_fd_set_t)NULL,
- (Select_fd_set_t)NULL, &tv);
+ (Select_fd_set_t)NULL, &tv);
}
-#endif
+# endif
#endif /* #if !defined(HAS_USLEEP) && defined(HAS_SELECT) */
#if !defined(HAS_USLEEP) && defined(WIN32)
-#define HAS_USLEEP
-#define usleep hrt_usleep /* could conflict with ncurses for static build */
+# define HAS_USLEEP
+# define usleep hrt_usleep /* could conflict with ncurses for static build */
static void
hrt_usleep(unsigned long usec)
@@ -475,8 +561,8 @@ hrt_usleep(unsigned long usec)
#endif /* #if !defined(HAS_USLEEP) && defined(WIN32) */
#if !defined(HAS_USLEEP) && defined(HAS_POLL)
-#define HAS_USLEEP
-#define usleep hrt_usleep /* could conflict with ncurses for static build */
+# define HAS_USLEEP
+# define usleep hrt_usleep /* could conflict with ncurses for static build */
static void
hrt_usleep(unsigned long usec)
@@ -492,34 +578,34 @@ hrt_usleep(unsigned long usec)
static int
hrt_ualarm_itimero(struct itimerval *oitv, int usec, int uinterval)
{
- struct itimerval itv;
- itv.it_value.tv_sec = usec / IV_1E6;
- itv.it_value.tv_usec = usec % IV_1E6;
- itv.it_interval.tv_sec = uinterval / IV_1E6;
- itv.it_interval.tv_usec = uinterval % IV_1E6;
- return setitimer(ITIMER_REAL, &itv, oitv);
+ struct itimerval itv;
+ itv.it_value.tv_sec = usec / IV_1E6;
+ itv.it_value.tv_usec = usec % IV_1E6;
+ itv.it_interval.tv_sec = uinterval / IV_1E6;
+ itv.it_interval.tv_usec = uinterval % IV_1E6;
+ return setitimer(ITIMER_REAL, &itv, oitv);
}
#endif /* #if !defined(HAS_UALARM) && defined(HAS_SETITIMER) */
#if !defined(HAS_UALARM) && defined(HAS_SETITIMER)
-#define HAS_UALARM
-#define ualarm hrt_ualarm_itimer /* could conflict with ncurses for static build */
+# define HAS_UALARM
+# define ualarm hrt_ualarm_itimer /* could conflict with ncurses for static build */
#endif
#if !defined(HAS_UALARM) && defined(VMS)
-#define HAS_UALARM
-#define ualarm vms_ualarm
+# define HAS_UALARM
+# define ualarm vms_ualarm
-#include <lib$routines.h>
-#include <ssdef.h>
-#include <starlet.h>
-#include <descrip.h>
-#include <signal.h>
-#include <jpidef.h>
-#include <psldef.h>
+# include <lib$routines.h>
+# include <ssdef.h>
+# include <starlet.h>
+# include <descrip.h>
+# include <signal.h>
+# include <jpidef.h>
+# include <psldef.h>
-#define VMSERR(s) (!((s)&1))
+# define VMSERR(s) (!((s)&1))
static void
us_to_VMS(useconds_t mseconds, unsigned long v[])
@@ -567,13 +653,13 @@ typedef struct _ualarm {
static int alarm_ef;
static Alarm *a0, alarm_base;
-#define UAL_NULL 0
-#define UAL_SET 1
-#define UAL_CLEAR 2
-#define UAL_ACTIVE 4
+# define UAL_NULL 0
+# define UAL_SET 1
+# define UAL_CLEAR 2
+# define UAL_ACTIVE 4
static void ualarm_AST(Alarm *a);
-static int
+static int
vms_ualarm(int mseconds, int interval)
{
Alarm *a, abase;
@@ -605,7 +691,7 @@ vms_ualarm(int mseconds, int interval)
a0->function = UAL_NULL;
}
itmlst[0].bufaddr = &asten;
-
+
iss = sys$getjpiw(0,0,0,itmlst,0,0,0);
if (VMSERR(iss)) lib$signal(iss);
if (!(asten&0x08)) return -1;
@@ -621,7 +707,7 @@ vms_ualarm(int mseconds, int interval)
if (interval) {
us_to_VMS(interval, a->interval);
a->repeat = 1;
- } else
+ } else
a->repeat = 0;
iss = sys$clref(alarm_ef);
@@ -633,7 +719,7 @@ vms_ualarm(int mseconds, int interval)
iss = sys$waitfr(alarm_ef);
if (VMSERR(iss)) lib$signal(iss);
- if (a->function == UAL_ACTIVE)
+ if (a->function == UAL_ACTIVE)
return VMS_to_us(a->remain);
else
return 0;
@@ -658,7 +744,7 @@ ualarm_AST(Alarm *a)
iss = lib$subx(a0->remain, now, a->remain);
if (VMSERR(iss)) lib$signal(iss);
- if (a->remain[1] & 0x80000000)
+ if (a->remain[1] & 0x80000000)
a->remain[0] = a->remain[1] = 0;
}
@@ -709,24 +795,24 @@ ualarm_AST(Alarm *a)
static int
myU2time(pTHX_ UV *ret)
{
- struct timeval Tp;
- int status;
- status = gettimeofday (&Tp, NULL);
- ret[0] = Tp.tv_sec;
- ret[1] = Tp.tv_usec;
- return status;
+ struct timeval Tp;
+ int status;
+ status = gettimeofday (&Tp, NULL);
+ ret[0] = Tp.tv_sec;
+ ret[1] = Tp.tv_usec;
+ return status;
}
static NV
myNVtime()
{
-#ifdef WIN32
- dTHX;
-#endif
- struct timeval Tp;
- int status;
- status = gettimeofday (&Tp, NULL);
- return status == 0 ? Tp.tv_sec + (Tp.tv_usec / NV_1E6) : -1.0;
+# ifdef WIN32
+ dTHX;
+# endif
+ struct timeval Tp;
+ int status;
+ status = gettimeofday (&Tp, NULL);
+ return status == 0 ? Tp.tv_sec + (Tp.tv_usec / NV_1E6) : -1.0;
}
#endif /* #ifdef HAS_GETTIMEOFDAY */
@@ -734,31 +820,31 @@ myNVtime()
static void
hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
{
- dTHX;
+ dTHX;
#if TIME_HIRES_STAT == 1
- *atime_nsec = PL_statcache.st_atimespec.tv_nsec;
- *mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
- *ctime_nsec = PL_statcache.st_ctimespec.tv_nsec;
+ *atime_nsec = PL_statcache.st_atimespec.tv_nsec;
+ *mtime_nsec = PL_statcache.st_mtimespec.tv_nsec;
+ *ctime_nsec = PL_statcache.st_ctimespec.tv_nsec;
#elif TIME_HIRES_STAT == 2
- *atime_nsec = PL_statcache.st_atimensec;
- *mtime_nsec = PL_statcache.st_mtimensec;
- *ctime_nsec = PL_statcache.st_ctimensec;
+ *atime_nsec = PL_statcache.st_atimensec;
+ *mtime_nsec = PL_statcache.st_mtimensec;
+ *ctime_nsec = PL_statcache.st_ctimensec;
#elif TIME_HIRES_STAT == 3
- *atime_nsec = PL_statcache.st_atime_n;
- *mtime_nsec = PL_statcache.st_mtime_n;
- *ctime_nsec = PL_statcache.st_ctime_n;
+ *atime_nsec = PL_statcache.st_atime_n;
+ *mtime_nsec = PL_statcache.st_mtime_n;
+ *ctime_nsec = PL_statcache.st_ctime_n;
#elif TIME_HIRES_STAT == 4
- *atime_nsec = PL_statcache.st_atim.tv_nsec;
- *mtime_nsec = PL_statcache.st_mtim.tv_nsec;
- *ctime_nsec = PL_statcache.st_ctim.tv_nsec;
+ *atime_nsec = PL_statcache.st_atim.tv_nsec;
+ *mtime_nsec = PL_statcache.st_mtim.tv_nsec;
+ *ctime_nsec = PL_statcache.st_ctim.tv_nsec;
#elif TIME_HIRES_STAT == 5
- *atime_nsec = PL_statcache.st_uatime * 1000;
- *mtime_nsec = PL_statcache.st_umtime * 1000;
- *ctime_nsec = PL_statcache.st_uctime * 1000;
+ *atime_nsec = PL_statcache.st_uatime * 1000;
+ *mtime_nsec = PL_statcache.st_umtime * 1000;
+ *ctime_nsec = PL_statcache.st_uctime * 1000;
#else /* !TIME_HIRES_STAT */
- *atime_nsec = 0;
- *mtime_nsec = 0;
- *ctime_nsec = 0;
+ *atime_nsec = 0;
+ *mtime_nsec = 0;
+ *ctime_nsec = 0;
#endif /* !TIME_HIRES_STAT */
}
@@ -770,157 +856,157 @@ hrstatns(UV *atime_nsec, UV *mtime_nsec, UV *ctime_nsec)
defined(TIME_HIRES_CLOCK_GETRES_EMULATION) || \
defined(TIME_HIRES_CLOCK_NANOSLEEP_EMULATION))
-#ifndef CLOCK_REALTIME
-# define CLOCK_REALTIME 0x01
-# define CLOCK_MONOTONIC 0x02
-#endif
+# ifndef CLOCK_REALTIME
+# define CLOCK_REALTIME 0x01
+# define CLOCK_MONOTONIC 0x02
+# endif
-#ifndef TIMER_ABSTIME
-# define TIMER_ABSTIME 0x01
-#endif
+# ifndef TIMER_ABSTIME
+# define TIMER_ABSTIME 0x01
+# endif
-#ifdef USE_ITHREADS
-# define PERL_DARWIN_MUTEX
-#endif
+# ifdef USE_ITHREADS
+# define PERL_DARWIN_MUTEX
+# endif
-#ifdef PERL_DARWIN_MUTEX
+# ifdef PERL_DARWIN_MUTEX
STATIC perl_mutex darwin_time_mutex;
-#endif
+# endif
-#include <mach/mach_time.h>
+# include <mach/mach_time.h>
static uint64_t absolute_time_init;
static mach_timebase_info_data_t timebase_info;
static struct timespec timespec_init;
static int darwin_time_init() {
- struct timeval tv;
- int success = 1;
-#ifdef PERL_DARWIN_MUTEX
- MUTEX_LOCK(&darwin_time_mutex);
-#endif
- if (absolute_time_init == 0) {
- /* mach_absolute_time() cannot fail */
- absolute_time_init = mach_absolute_time();
- success = mach_timebase_info(&timebase_info) == KERN_SUCCESS;
- if (success) {
- success = gettimeofday(&tv, NULL) == 0;
- if (success) {
- timespec_init.tv_sec = tv.tv_sec;
- timespec_init.tv_nsec = tv.tv_usec * 1000;
- }
+ struct timeval tv;
+ int success = 1;
+# ifdef PERL_DARWIN_MUTEX
+ MUTEX_LOCK(&darwin_time_mutex);
+# endif
+ if (absolute_time_init == 0) {
+ /* mach_absolute_time() cannot fail */
+ absolute_time_init = mach_absolute_time();
+ success = mach_timebase_info(&timebase_info) == KERN_SUCCESS;
+ if (success) {
+ success = gettimeofday(&tv, NULL) == 0;
+ if (success) {
+ timespec_init.tv_sec = tv.tv_sec;
+ timespec_init.tv_nsec = tv.tv_usec * 1000;
+ }
+ }
}
- }
-#ifdef PERL_DARWIN_MUTEX
- MUTEX_UNLOCK(&darwin_time_mutex);
-#endif
- return success;
+# ifdef PERL_DARWIN_MUTEX
+ MUTEX_UNLOCK(&darwin_time_mutex);
+# endif
+ return success;
}
-#ifdef TIME_HIRES_CLOCK_GETTIME_EMULATION
+# ifdef TIME_HIRES_CLOCK_GETTIME_EMULATION
static int th_clock_gettime(clockid_t clock_id, struct timespec *ts) {
- if (darwin_time_init() && timebase_info.denom) {
- switch (clock_id) {
- case CLOCK_REALTIME:
- {
- uint64_t nanos =
- ((mach_absolute_time() - absolute_time_init) *
- (uint64_t)timebase_info.numer) / (uint64_t)timebase_info.denom;
- ts->tv_sec = timespec_init.tv_sec + nanos / IV_1E9;
- ts->tv_nsec = timespec_init.tv_nsec + nanos % IV_1E9;
- return 0;
- }
-
- case CLOCK_MONOTONIC:
- {
- uint64_t nanos =
- (mach_absolute_time() *
- (uint64_t)timebase_info.numer) / (uint64_t)timebase_info.denom;
- ts->tv_sec = nanos / IV_1E9;
- ts->tv_nsec = nanos - ts->tv_sec * IV_1E9;
- return 0;
- }
-
- default:
- break;
+ if (darwin_time_init() && timebase_info.denom) {
+ switch (clock_id) {
+ case CLOCK_REALTIME:
+ {
+ uint64_t nanos =
+ ((mach_absolute_time() - absolute_time_init) *
+ (uint64_t)timebase_info.numer) / (uint64_t)timebase_info.denom;
+ ts->tv_sec = timespec_init.tv_sec + nanos / IV_1E9;
+ ts->tv_nsec = timespec_init.tv_nsec + nanos % IV_1E9;
+ return 0;
+ }
+
+ case CLOCK_MONOTONIC:
+ {
+ uint64_t nanos =
+ (mach_absolute_time() *
+ (uint64_t)timebase_info.numer) / (uint64_t)timebase_info.denom;
+ ts->tv_sec = nanos / IV_1E9;
+ ts->tv_nsec = nanos - ts->tv_sec * IV_1E9;
+ return 0;
+ }
+
+ default:
+ break;
+ }
}
- }
- SETERRNO(EINVAL, LIB_INVARG);
- return -1;
+ SETERRNO(EINVAL, LIB_INVARG);
+ return -1;
}
-#define clock_gettime(clock_id, ts) th_clock_gettime((clock_id), (ts))
+# define clock_gettime(clock_id, ts) th_clock_gettime((clock_id), (ts))
-#endif /* TIME_HIRES_CLOCK_GETTIME_EMULATION */
+# endif /* TIME_HIRES_CLOCK_GETTIME_EMULATION */
-#ifdef TIME_HIRES_CLOCK_GETRES_EMULATION
+# ifdef TIME_HIRES_CLOCK_GETRES_EMULATION
static int th_clock_getres(clockid_t clock_id, struct timespec *ts) {
- if (darwin_time_init() && timebase_info.denom) {
- switch (clock_id) {
- case CLOCK_REALTIME:
- case CLOCK_MONOTONIC:
- ts->tv_sec = 0;
- /* In newer kernels both the numer and denom are one,
- * resulting in conversion factor of one, which is of
- * course unrealistic. */
- ts->tv_nsec = timebase_info.numer / timebase_info.denom;
- return 0;
- default:
- break;
+ if (darwin_time_init() && timebase_info.denom) {
+ switch (clock_id) {
+ case CLOCK_REALTIME:
+ case CLOCK_MONOTONIC:
+ ts->tv_sec = 0;
+ /* In newer kernels both the numer and denom are one,
+ * resulting in conversion factor of one, which is of
+ * course unrealistic. */
+ ts->tv_nsec = timebase_info.numer / timebase_info.denom;
+ return 0;
+ default:
+ break;
+ }
}
- }
- SETERRNO(EINVAL, LIB_INVARG);
- return -1;
+ SETERRNO(EINVAL, LIB_INVARG);
+ return -1;
}
-#define clock_getres(clock_id, ts) th_clock_getres((clock_id), (ts))
-#endif /* TIME_HIRES_CLOCK_GETRES_EMULATION */
+# define clock_getres(clock_id, ts) th_clock_getres((clock_id), (ts))
+# endif /* TIME_HIRES_CLOCK_GETRES_EMULATION */
-#ifdef TIME_HIRES_CLOCK_NANOSLEEP_EMULATION
+# ifdef TIME_HIRES_CLOCK_NANOSLEEP_EMULATION
static int th_clock_nanosleep(clockid_t clock_id, int flags,
- const struct timespec *rqtp,
- struct timespec *rmtp) {
- if (darwin_time_init()) {
- switch (clock_id) {
- case CLOCK_REALTIME:
- case CLOCK_MONOTONIC:
- {
- uint64_t nanos = rqtp->tv_sec * IV_1E9 + rqtp->tv_nsec;
- int success;
- if ((flags & TIMER_ABSTIME)) {
- uint64_t back =
- timespec_init.tv_sec * IV_1E9 + timespec_init.tv_nsec;
- nanos = nanos > back ? nanos - back : 0;
- }
- success =
- mach_wait_until(mach_absolute_time() + nanos) == KERN_SUCCESS;
-
- /* In the relative sleep, the rmtp should be filled in with
- * the 'unused' part of the rqtp in case the sleep gets
- * interrupted by a signal. But it is unknown how signals
- * interact with mach_wait_until(). In the absolute sleep,
- * the rmtp should stay untouched. */
- rmtp->tv_sec = 0;
- rmtp->tv_nsec = 0;
-
- return success;
- }
+ const struct timespec *rqtp,
+ struct timespec *rmtp) {
+ if (darwin_time_init()) {
+ switch (clock_id) {
+ case CLOCK_REALTIME:
+ case CLOCK_MONOTONIC:
+ {
+ uint64_t nanos = rqtp->tv_sec * IV_1E9 + rqtp->tv_nsec;
+ int success;
+ if ((flags & TIMER_ABSTIME)) {
+ uint64_t back =
+ timespec_init.tv_sec * IV_1E9 + timespec_init.tv_nsec;
+ nanos = nanos > back ? nanos - back : 0;
+ }
+ success =
+ mach_wait_until(mach_absolute_time() + nanos) == KERN_SUCCESS;
+
+ /* In the relative sleep, the rmtp should be filled in with
+ * the 'unused' part of the rqtp in case the sleep gets
+ * interrupted by a signal. But it is unknown how signals
+ * interact with mach_wait_until(). In the absolute sleep,
+ * the rmtp should stay untouched. */
+ rmtp->tv_sec = 0;
+ rmtp->tv_nsec = 0;
+
+ return success;
+ }
- default:
- break;
+ default:
+ break;
+ }
}
- }
- SETERRNO(EINVAL, LIB_INVARG);
- return -1;
+ SETERRNO(EINVAL, LIB_INVARG);
+ return -1;
}
-#define clock_nanosleep(clock_id, flags, rqtp, rmtp) \
+# define clock_nanosleep(clock_id, flags, rqtp, rmtp) \
th_clock_nanosleep((clock_id), (flags), (rqtp), (rmtp))
-#endif /* TIME_HIRES_CLOCK_NANOSLEEP_EMULATION */
+# endif /* TIME_HIRES_CLOCK_NANOSLEEP_EMULATION */
#endif /* PERL_DARWIN */
@@ -937,25 +1023,25 @@ static int th_clock_nanosleep(clockid_t clock_id, int flags,
* are always available.
*/
#ifndef __has_builtin
-# define __has_builtin(x) 0 /* non-clang */
+# define __has_builtin(x) 0 /* non-clang */
#endif
#ifdef HAS_FUTIMENS
-# if defined(PERL_DARWIN) && __has_builtin(__builtin_available)
-# define FUTIMENS_AVAILABLE __builtin_available(macOS 10.13, *)
-# else
-# define FUTIMENS_AVAILABLE 1
-# endif
+# if defined(PERL_DARWIN) && __has_builtin(__builtin_available)
+# define FUTIMENS_AVAILABLE __builtin_available(macOS 10.13, *)
+# else
+# define FUTIMENS_AVAILABLE 1
+# endif
#else
-# define FUTIMENS_AVAILABLE 0
+# define FUTIMENS_AVAILABLE 0
#endif
#ifdef HAS_UTIMENSAT
-# if defined(PERL_DARWIN) && __has_builtin(__builtin_available)
-# define UTIMENSAT_AVAILABLE __builtin_available(macOS 10.13, *)
-# else
-# define UTIMENSAT_AVAILABLE 1
-# endif
+# if defined(PERL_DARWIN) && __has_builtin(__builtin_available)
+# define UTIMENSAT_AVAILABLE __builtin_available(macOS 10.13, *)
+# else
+# define UTIMENSAT_AVAILABLE 1
+# endif
#else
-# define UTIMENSAT_AVAILABLE 0
+# define UTIMENSAT_AVAILABLE 0
#endif
#include "const-c.inc"
@@ -976,23 +1062,23 @@ nanosleep_init(NV nsec,
static NV
nsec_without_unslept(struct timespec *sleepfor,
const struct timespec *unslept) {
- if (sleepfor->tv_sec >= unslept->tv_sec) {
- sleepfor->tv_sec -= unslept->tv_sec;
- if (sleepfor->tv_nsec >= unslept->tv_nsec) {
- sleepfor->tv_nsec -= unslept->tv_nsec;
- } else if (sleepfor->tv_sec > 0) {
- sleepfor->tv_sec--;
- sleepfor->tv_nsec += IV_1E9;
- sleepfor->tv_nsec -= unslept->tv_nsec;
+ if (sleepfor->tv_sec >= unslept->tv_sec) {
+ sleepfor->tv_sec -= unslept->tv_sec;
+ if (sleepfor->tv_nsec >= unslept->tv_nsec) {
+ sleepfor->tv_nsec -= unslept->tv_nsec;
+ } else if (sleepfor->tv_sec > 0) {
+ sleepfor->tv_sec--;
+ sleepfor->tv_nsec += IV_1E9;
+ sleepfor->tv_nsec -= unslept->tv_nsec;
+ } else {
+ sleepfor->tv_sec = 0;
+ sleepfor->tv_nsec = 0;
+ }
} else {
- sleepfor->tv_sec = 0;
- sleepfor->tv_nsec = 0;
+ sleepfor->tv_sec = 0;
+ sleepfor->tv_nsec = 0;
}
- } else {
- sleepfor->tv_sec = 0;
- sleepfor->tv_nsec = 0;
- }
- return ((NV)sleepfor->tv_sec) * NV_1E9 + ((NV)sleepfor->tv_nsec);
+ return ((NV)sleepfor->tv_sec) * NV_1E9 + ((NV)sleepfor->tv_nsec);
}
#endif
@@ -1000,17 +1086,17 @@ nsec_without_unslept(struct timespec *sleepfor,
/* In case Perl and/or Devel::PPPort are too old, minimally emulate
* IS_SAFE_PATHNAME() (which looks for zero bytes in the pathname). */
#ifndef IS_SAFE_PATHNAME
-#if PERL_VERSION >= 12 /* Perl_ck_warner is 5.10.0 -> */
-#ifdef WARN_SYSCALLS
-#define WARNEMUCAT WARN_SYSCALLS /* 5.22.0 -> */
-#else
-#define WARNEMUCAT WARN_MISC
-#endif
-#define WARNEMU(opname) Perl_ck_warner(aTHX_ packWARN(WARNEMUCAT), "Invalid \\0 character in pathname for %s",opname)
-#else
-#define WARNEMU(opname) Perl_warn(aTHX_ "Invalid \\0 character in pathname for %s",opname)
-#endif
-#define IS_SAFE_PATHNAME(pv, len, opname) (((len)>1)&&memchr((pv), 0, (len)-1)?(SETERRNO(ENOENT, LIB_INVARG),WARNEMU(opname),FALSE):(TRUE))
+# if PERL_VERSION >= 12 /* Perl_ck_warner is 5.10.0 -> */
+# ifdef WARN_SYSCALLS
+# define WARNEMUCAT WARN_SYSCALLS /* 5.22.0 -> */
+# else
+# define WARNEMUCAT WARN_MISC
+# endif
+# define WARNEMU(opname) Perl_ck_warner(aTHX_ packWARN(WARNEMUCAT), "Invalid \\0 character in pathname for %s",opname)
+# else
+# define WARNEMU(opname) Perl_warn(aTHX_ "Invalid \\0 character in pathname for %s",opname)
+# endif
+# define IS_SAFE_PATHNAME(pv, len, opname) (((len)>1)&&memchr((pv), 0, (len)-1)?(SETERRNO(ENOENT, LIB_INVARG),WARNEMU(opname),FALSE):(TRUE))
#endif
MODULE = Time::HiRes PACKAGE = Time::HiRes
@@ -1018,33 +1104,31 @@ MODULE = Time::HiRes PACKAGE = Time::HiRes
PROTOTYPES: ENABLE
BOOT:
-{
+ {
#ifdef MY_CXT_KEY
- MY_CXT_INIT;
+ MY_CXT_INIT;
#endif
-#ifdef ATLEASTFIVEOHOHFIVE
-# ifdef HAS_GETTIMEOFDAY
- {
- (void) hv_store(PL_modglobal, "Time::NVtime", 12,
- newSViv(PTR2IV(myNVtime)), 0);
- (void) hv_store(PL_modglobal, "Time::U2time", 12,
- newSViv(PTR2IV(myU2time)), 0);
- }
-# endif
+#ifdef HAS_GETTIMEOFDAY
+ {
+ (void) hv_store(PL_modglobal, "Time::NVtime", 12,
+ newSViv(PTR2IV(myNVtime)), 0);
+ (void) hv_store(PL_modglobal, "Time::U2time", 12,
+ newSViv(PTR2IV(myU2time)), 0);
+ }
#endif
#if defined(PERL_DARWIN)
# if defined(USE_ITHREADS) && defined(PERL_DARWIN_MUTEX)
- MUTEX_INIT(&darwin_time_mutex);
+ MUTEX_INIT(&darwin_time_mutex);
# endif
#endif
-}
+ }
#if defined(USE_ITHREADS) && defined(MY_CXT_KEY)
void
CLONE(...)
CODE:
- MY_CXT_CLONE;
+ MY_CXT_CLONE;
#endif
@@ -1054,122 +1138,125 @@ INCLUDE: const-xs.inc
NV
usleep(useconds)
- NV useconds
- PREINIT:
- struct timeval Ta, Tb;
- CODE:
- gettimeofday(&Ta, NULL);
- if (items > 0) {
- if (useconds >= NV_1E6) {
- IV seconds = (IV) (useconds / NV_1E6);
- /* If usleep() has been implemented using setitimer()
- * then this contortion is unnecessary-- but usleep()
- * may be implemented in some other way, so let's contort. */
- if (seconds) {
- sleep(seconds);
- useconds -= NV_1E6 * seconds;
- }
- } else if (useconds < 0.0)
- croak("Time::HiRes::usleep(%" NVgf
+ NV useconds
+ PREINIT:
+ struct timeval Ta, Tb;
+ CODE:
+ gettimeofday(&Ta, NULL);
+ if (items > 0) {
+ if (useconds >= NV_1E6) {
+ IV seconds = (IV) (useconds / NV_1E6);
+ /* If usleep() has been implemented using setitimer()
+ * then this contortion is unnecessary-- but usleep()
+ * may be implemented in some other way, so let's contort. */
+ if (seconds) {
+ sleep(seconds);
+ useconds -= NV_1E6 * seconds;
+ }
+ } else if (useconds < 0.0)
+ croak("Time::HiRes::usleep(%" NVgf
"): negative time not invented yet", useconds);
- usleep((U32)useconds);
- } else
- PerlProc_pause();
- gettimeofday(&Tb, NULL);
-#if 0
- printf("[%ld %ld] [%ld %ld]\n", Tb.tv_sec, Tb.tv_usec, Ta.tv_sec, Ta.tv_usec);
-#endif
- RETVAL = NV_1E6*(Tb.tv_sec-Ta.tv_sec)+(NV)((IV)Tb.tv_usec-(IV)Ta.tv_usec);
- OUTPUT:
- RETVAL
+ usleep((U32)useconds);
+ } else
+ PerlProc_pause();
-#if defined(TIME_HIRES_NANOSLEEP)
+ gettimeofday(&Tb, NULL);
+# if 0
+ printf("[%ld %ld] [%ld %ld]\n", Tb.tv_sec, Tb.tv_usec, Ta.tv_sec, Ta.tv_usec);
+# endif
+ RETVAL = NV_1E6*(Tb.tv_sec-Ta.tv_sec)+(NV)((IV)Tb.tv_usec-(IV)Ta.tv_usec);
+
+ OUTPUT:
+ RETVAL
+
+# if defined(TIME_HIRES_NANOSLEEP)
NV
nanosleep(nsec)
- NV nsec
- PREINIT:
- struct timespec sleepfor, unslept;
- CODE:
- if (nsec < 0.0)
- croak("Time::HiRes::nanosleep(%" NVgf
+ NV nsec
+ PREINIT:
+ struct timespec sleepfor, unslept;
+ CODE:
+ if (nsec < 0.0)
+ croak("Time::HiRes::nanosleep(%" NVgf
"): negative time not invented yet", nsec);
nanosleep_init(nsec, &sleepfor, &unslept);
- if (nanosleep(&sleepfor, &unslept) == 0) {
- RETVAL = nsec;
- } else {
+ if (nanosleep(&sleepfor, &unslept) == 0) {
+ RETVAL = nsec;
+ } else {
RETVAL = nsec_without_unslept(&sleepfor, &unslept);
- }
+ }
OUTPUT:
- RETVAL
+ RETVAL
-#else /* #if defined(TIME_HIRES_NANOSLEEP) */
+# else /* #if defined(TIME_HIRES_NANOSLEEP) */
NV
nanosleep(nsec)
- NV nsec
+ NV nsec
CODE:
- PERL_UNUSED_ARG(nsec);
+ PERL_UNUSED_ARG(nsec);
croak("Time::HiRes::nanosleep(): unimplemented in this platform");
RETVAL = 0.0;
OUTPUT:
- RETVAL
+ RETVAL
-#endif /* #if defined(TIME_HIRES_NANOSLEEP) */
+# endif /* #if defined(TIME_HIRES_NANOSLEEP) */
NV
sleep(...)
- PREINIT:
- struct timeval Ta, Tb;
- CODE:
- gettimeofday(&Ta, NULL);
- if (items > 0) {
- NV seconds = SvNV(ST(0));
- if (seconds >= 0.0) {
- UV useconds = (UV)(1E6 * (seconds - (UV)seconds));
- if (seconds >= 1.0)
- sleep((U32)seconds);
- if ((IV)useconds < 0) {
-#if defined(__sparc64__) && defined(__GNUC__)
- /* Sparc64 gcc 2.95.3 (e.g. on NetBSD) has a bug
- * where (0.5 - (UV)(0.5)) will under certain
- * circumstances (if the double is cast to UV more
- * than once?) evaluate to -0.5, instead of 0.5. */
- useconds = -(IV)useconds;
-#endif /* #if defined(__sparc64__) && defined(__GNUC__) */
- if ((IV)useconds < 0)
- croak("Time::HiRes::sleep(%" NVgf
- "): internal error: useconds < 0 (unsigned %" UVuf
- " signed %" IVdf ")",
- seconds, useconds, (IV)useconds);
- }
- usleep(useconds);
- } else
- croak("Time::HiRes::sleep(%" NVgf
+ PREINIT:
+ struct timeval Ta, Tb;
+ CODE:
+ gettimeofday(&Ta, NULL);
+ if (items > 0) {
+ NV seconds = SvNV(ST(0));
+ if (seconds >= 0.0) {
+ UV useconds = (UV)(1E6 * (seconds - (UV)seconds));
+ if (seconds >= 1.0)
+ sleep((U32)seconds);
+ if ((IV)useconds < 0) {
+# if defined(__sparc64__) && defined(__GNUC__)
+ /* Sparc64 gcc 2.95.3 (e.g. on NetBSD) has a bug
+ * where (0.5 - (UV)(0.5)) will under certain
+ * circumstances (if the double is cast to UV more
+ * than once?) evaluate to -0.5, instead of 0.5. */
+ useconds = -(IV)useconds;
+# endif /* #if defined(__sparc64__) && defined(__GNUC__) */
+ if ((IV)useconds < 0)
+ croak("Time::HiRes::sleep(%" NVgf
+ "): internal error: useconds < 0 (unsigned %" UVuf
+ " signed %" IVdf ")",
+ seconds, useconds, (IV)useconds);
+ }
+ usleep(useconds);
+ } else
+ croak("Time::HiRes::sleep(%" NVgf
"): negative time not invented yet", seconds);
- } else
- PerlProc_pause();
- gettimeofday(&Tb, NULL);
-#if 0
- printf("[%ld %ld] [%ld %ld]\n", Tb.tv_sec, Tb.tv_usec, Ta.tv_sec, Ta.tv_usec);
-#endif
- RETVAL = (NV)(Tb.tv_sec-Ta.tv_sec)+0.000001*(NV)(Tb.tv_usec-Ta.tv_usec);
+ } else
+ PerlProc_pause();
+
+ gettimeofday(&Tb, NULL);
+# if 0
+ printf("[%ld %ld] [%ld %ld]\n", Tb.tv_sec, Tb.tv_usec, Ta.tv_sec, Ta.tv_usec);
+# endif
+ RETVAL = (NV)(Tb.tv_sec-Ta.tv_sec)+0.000001*(NV)(Tb.tv_usec-Ta.tv_usec);
- OUTPUT:
- RETVAL
+ OUTPUT:
+ RETVAL
#else /* #if defined(HAS_USLEEP) && defined(HAS_GETTIMEOFDAY) */
NV
usleep(useconds)
- NV useconds
+ NV useconds
CODE:
- PERL_UNUSED_ARG(useconds);
+ PERL_UNUSED_ARG(useconds);
croak("Time::HiRes::usleep(): unimplemented in this platform");
RETVAL = 0.0;
OUTPUT:
- RETVAL
+ RETVAL
#endif /* #if defined(HAS_USLEEP) && defined(HAS_GETTIMEOFDAY) */
@@ -1177,241 +1264,204 @@ usleep(useconds)
IV
ualarm(useconds,uinterval=0)
- int useconds
- int uinterval
- CODE:
- if (useconds < 0 || uinterval < 0)
- croak("Time::HiRes::ualarm(%d, %d): negative time not invented yet", useconds, uinterval);
-#if defined(HAS_SETITIMER) && defined(ITIMER_REAL)
- {
- struct itimerval itv;
- if (hrt_ualarm_itimero(&itv, useconds, uinterval)) {
- /* To conform to ualarm's interface, we're actually ignoring
- an error here. */
- RETVAL = 0;
- } else {
- RETVAL = itv.it_value.tv_sec * IV_1E6 + itv.it_value.tv_usec;
- }
- }
-#else
- if (useconds >= IV_1E6 || uinterval >= IV_1E6)
- croak("Time::HiRes::ualarm(%d, %d): useconds or uinterval"
- " equal to or more than %" IVdf,
- useconds, uinterval, IV_1E6);
- RETVAL = ualarm(useconds, uinterval);
-#endif
+ int useconds
+ int uinterval
+ CODE:
+ if (useconds < 0 || uinterval < 0)
+ croak("Time::HiRes::ualarm(%d, %d): negative time not invented yet", useconds, uinterval);
+# if defined(HAS_SETITIMER) && defined(ITIMER_REAL)
+ {
+ struct itimerval itv;
+ if (hrt_ualarm_itimero(&itv, useconds, uinterval)) {
+ /* To conform to ualarm's interface, we're actually ignoring
+ an error here. */
+ RETVAL = 0;
+ } else {
+ RETVAL = itv.it_value.tv_sec * IV_1E6 + itv.it_value.tv_usec;
+ }
+ }
+# else
+ if (useconds >= IV_1E6 || uinterval >= IV_1E6)
+ croak("Time::HiRes::ualarm(%d, %d): useconds or uinterval"
+ " equal to or more than %" IVdf,
+ useconds, uinterval, IV_1E6);
+
+ RETVAL = ualarm(useconds, uinterval);
+# endif
- OUTPUT:
- RETVAL
+ OUTPUT:
+ RETVAL
NV
alarm(seconds,interval=0)
- NV seconds
- NV interval
- CODE:
- if (seconds < 0.0 || interval < 0.0)
- croak("Time::HiRes::alarm(%" NVgf ", %" NVgf
+ NV seconds
+ NV interval
+ CODE:
+ if (seconds < 0.0 || interval < 0.0)
+ croak("Time::HiRes::alarm(%" NVgf ", %" NVgf
"): negative time not invented yet", seconds, interval);
- {
- IV iseconds = (IV)seconds;
- IV iinterval = (IV)interval;
- NV fseconds = seconds - iseconds;
- NV finterval = interval - iinterval;
- IV useconds, uinterval;
- if (fseconds >= 1.0 || finterval >= 1.0)
- croak("Time::HiRes::alarm(%" NVgf ", %" NVgf
+
+ {
+ IV iseconds = (IV)seconds;
+ IV iinterval = (IV)interval;
+ NV fseconds = seconds - iseconds;
+ NV finterval = interval - iinterval;
+ IV useconds, uinterval;
+ if (fseconds >= 1.0 || finterval >= 1.0)
+ croak("Time::HiRes::alarm(%" NVgf ", %" NVgf
"): seconds or interval too large to split correctly",
seconds, interval);
- useconds = IV_1E6 * fseconds;
- uinterval = IV_1E6 * finterval;
-#if defined(HAS_SETITIMER) && defined(ITIMER_REAL)
- {
- struct itimerval nitv, oitv;
- nitv.it_value.tv_sec = iseconds;
- nitv.it_value.tv_usec = useconds;
- nitv.it_interval.tv_sec = iinterval;
- nitv.it_interval.tv_usec = uinterval;
- if (setitimer(ITIMER_REAL, &nitv, &oitv)) {
- /* To conform to alarm's interface, we're actually ignoring
- an error here. */
- RETVAL = 0;
- } else {
- RETVAL = oitv.it_value.tv_sec + ((NV)oitv.it_value.tv_usec) / NV_1E6;
- }
- }
-#else
- if (iseconds || iinterval)
- croak("Time::HiRes::alarm(%" NVgf ", %" NVgf
+
+ useconds = IV_1E6 * fseconds;
+ uinterval = IV_1E6 * finterval;
+# if defined(HAS_SETITIMER) && defined(ITIMER_REAL)
+ {
+ struct itimerval nitv, oitv;
+ nitv.it_value.tv_sec = iseconds;
+ nitv.it_value.tv_usec = useconds;
+ nitv.it_interval.tv_sec = iinterval;
+ nitv.it_interval.tv_usec = uinterval;
+ if (setitimer(ITIMER_REAL, &nitv, &oitv)) {
+ /* To conform to alarm's interface, we're actually ignoring
+ an error here. */
+ RETVAL = 0;
+ } else {
+ RETVAL = oitv.it_value.tv_sec + ((NV)oitv.it_value.tv_usec) / NV_1E6;
+ }
+ }
+# else
+ if (iseconds || iinterval)
+ croak("Time::HiRes::alarm(%" NVgf ", %" NVgf
"): seconds or interval equal to or more than 1.0 ",
seconds, interval);
- RETVAL = (NV)ualarm( useconds, uinterval ) / NV_1E6;
-#endif
- }
- OUTPUT:
- RETVAL
+ RETVAL = (NV)ualarm( useconds, uinterval ) / NV_1E6;
+# endif
+ }
-#else
+ OUTPUT:
+ RETVAL
+
+#else /* #ifdef HAS_UALARM */
int
ualarm(useconds,interval=0)
- int useconds
- int interval
+ int useconds
+ int interval
CODE:
- PERL_UNUSED_ARG(useconds);
- PERL_UNUSED_ARG(interval);
+ PERL_UNUSED_ARG(useconds);
+ PERL_UNUSED_ARG(interval);
croak("Time::HiRes::ualarm(): unimplemented in this platform");
- RETVAL = -1;
+ RETVAL = -1;
OUTPUT:
- RETVAL
+ RETVAL
NV
alarm(seconds,interval=0)
- NV seconds
- NV interval
+ NV seconds
+ NV interval
CODE:
- PERL_UNUSED_ARG(seconds);
- PERL_UNUSED_ARG(interval);
+ PERL_UNUSED_ARG(seconds);
+ PERL_UNUSED_ARG(interval);
croak("Time::HiRes::alarm(): unimplemented in this platform");
- RETVAL = 0.0;
+ RETVAL = 0.0;
OUTPUT:
- RETVAL
+ RETVAL
#endif /* #ifdef HAS_UALARM */
#ifdef HAS_GETTIMEOFDAY
-# ifdef MACOS_TRADITIONAL /* fix epoch TZ and use unsigned time_t */
-void
-gettimeofday()
- PREINIT:
- struct timeval Tp;
- struct timezone Tz;
- PPCODE:
- int status;
- status = gettimeofday (&Tp, &Tz);
-
- if (status == 0) {
- Tp.tv_sec += Tz.tz_minuteswest * 60; /* adjust for TZ */
- if (GIMME == G_ARRAY) {
- EXTEND(sp, 2);
- /* Mac OS (Classic) has unsigned time_t */
- PUSHs(sv_2mortal(newSVuv(Tp.tv_sec)));
- PUSHs(sv_2mortal(newSViv(Tp.tv_usec)));
- } else {
- EXTEND(sp, 1);
- PUSHs(sv_2mortal(newSVnv(Tp.tv_sec + (Tp.tv_usec / NV_1E6))));
- }
- }
-NV
-time()
- PREINIT:
- struct timeval Tp;
- struct timezone Tz;
- CODE:
- int status;
- status = gettimeofday (&Tp, &Tz);
- if (status == 0) {
- Tp.tv_sec += Tz.tz_minuteswest * 60; /* adjust for TZ */
- RETVAL = Tp.tv_sec + (Tp.tv_usec / NV_1E6);
- } else {
- RETVAL = -1.0;
- }
- OUTPUT:
- RETVAL
-
-# else /* MACOS_TRADITIONAL */
void
gettimeofday()
- PREINIT:
+ PREINIT:
struct timeval Tp;
- PPCODE:
- int status;
+ PPCODE:
+ int status;
status = gettimeofday (&Tp, NULL);
- if (status == 0) {
- if (GIMME == G_ARRAY) {
- EXTEND(sp, 2);
- PUSHs(sv_2mortal(newSViv(Tp.tv_sec)));
- PUSHs(sv_2mortal(newSViv(Tp.tv_usec)));
- } else {
- EXTEND(sp, 1);
- PUSHs(sv_2mortal(newSVnv(Tp.tv_sec + (Tp.tv_usec / NV_1E6))));
- }
+ if (status == 0) {
+ if (GIMME == G_ARRAY) {
+ EXTEND(sp, 2);
+ PUSHs(sv_2mortal(newSViv(Tp.tv_sec)));
+ PUSHs(sv_2mortal(newSViv(Tp.tv_usec)));
+ } else {
+ EXTEND(sp, 1);
+ PUSHs(sv_2mortal(newSVnv(Tp.tv_sec + (Tp.tv_usec / NV_1E6))));
+ }
}
NV
time()
- PREINIT:
+ PREINIT:
struct timeval Tp;
- CODE:
- int status;
+ CODE:
+ int status;
status = gettimeofday (&Tp, NULL);
- if (status == 0) {
+ if (status == 0) {
RETVAL = Tp.tv_sec + (Tp.tv_usec / NV_1E6);
- } else {
- RETVAL = -1.0;
- }
- OUTPUT:
- RETVAL
+ } else {
+ RETVAL = -1.0;
+ }
+ OUTPUT:
+ RETVAL
-# endif /* MACOS_TRADITIONAL */
#endif /* #ifdef HAS_GETTIMEOFDAY */
#if defined(HAS_GETITIMER) && defined(HAS_SETITIMER)
-#define TV2NV(tv) ((NV)((tv).tv_sec) + 0.000001 * (NV)((tv).tv_usec))
+# define TV2NV(tv) ((NV)((tv).tv_sec) + 0.000001 * (NV)((tv).tv_usec))
void
setitimer(which, seconds, interval = 0)
- int which
- NV seconds
- NV interval
+ int which
+ NV seconds
+ NV interval
PREINIT:
- struct itimerval newit;
- struct itimerval oldit;
+ struct itimerval newit;
+ struct itimerval oldit;
PPCODE:
- if (seconds < 0.0 || interval < 0.0)
- croak("Time::HiRes::setitimer(%" IVdf ", %" NVgf ", %" NVgf
+ if (seconds < 0.0 || interval < 0.0)
+ croak("Time::HiRes::setitimer(%" IVdf ", %" NVgf ", %" NVgf
"): negative time not invented yet",
(IV)which, seconds, interval);
- newit.it_value.tv_sec = (IV)seconds;
- newit.it_value.tv_usec =
- (IV)((seconds - (NV)newit.it_value.tv_sec) * NV_1E6);
- newit.it_interval.tv_sec = (IV)interval;
- newit.it_interval.tv_usec =
- (IV)((interval - (NV)newit.it_interval.tv_sec) * NV_1E6);
+ newit.it_value.tv_sec = (IV)seconds;
+ newit.it_value.tv_usec =
+ (IV)((seconds - (NV)newit.it_value.tv_sec) * NV_1E6);
+ newit.it_interval.tv_sec = (IV)interval;
+ newit.it_interval.tv_usec =
+ (IV)((interval - (NV)newit.it_interval.tv_sec) * NV_1E6);
/* on some platforms the 1st arg to setitimer is an enum, which
* causes -Wc++-compat to complain about passing an int instead
*/
GCC_DIAG_IGNORE_STMT(-Wc++-compat);
- if (setitimer(which, &newit, &oldit) == 0) {
- EXTEND(sp, 1);
- PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_value))));
- if (GIMME == G_ARRAY) {
- EXTEND(sp, 1);
- PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_interval))));
- }
- }
+ if (setitimer(which, &newit, &oldit) == 0) {
+ EXTEND(sp, 1);
+ PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_value))));
+ if (GIMME == G_ARRAY) {
+ EXTEND(sp, 1);
+ PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_interval))));
+ }
+ }
GCC_DIAG_RESTORE_STMT;
void
getitimer(which)
- int which
+ int which
PREINIT:
- struct itimerval nowit;
+ struct itimerval nowit;
PPCODE:
/* on some platforms the 1st arg to getitimer is an enum, which
* causes -Wc++-compat to complain about passing an int instead
*/
GCC_DIAG_IGNORE_STMT(-Wc++-compat);
- if (getitimer(which, &nowit) == 0) {
- EXTEND(sp, 1);
- PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_value))));
- if (GIMME == G_ARRAY) {
- EXTEND(sp, 1);
- PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_interval))));
- }
- }
+ if (getitimer(which, &nowit) == 0) {
+ EXTEND(sp, 1);
+ PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_value))));
+ if (GIMME == G_ARRAY) {
+ EXTEND(sp, 1);
+ PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_interval))));
+ }
+ }
GCC_DIAG_RESTORE_STMT;
#endif /* #if defined(HAS_GETITIMER) && defined(HAS_SETITIMER) */
@@ -1422,82 +1472,83 @@ I32
utime(accessed, modified, ...)
PROTOTYPE: $$@
PREINIT:
- SV* accessed;
- SV* modified;
- SV* file;
+ SV* accessed;
+ SV* modified;
+ SV* file;
- struct timespec utbuf[2];
- struct timespec *utbufp = utbuf;
- int tot;
+ struct timespec utbuf[2];
+ struct timespec *utbufp = utbuf;
+ int tot;
CODE:
- accessed = ST(0);
- modified = ST(1);
- items -= 2;
- tot = 0;
-
- if ( accessed == &PL_sv_undef && modified == &PL_sv_undef )
- utbufp = NULL;
- else {
- if (SvNV(accessed) < 0.0 || SvNV(modified) < 0.0)
- croak("Time::HiRes::utime(%" NVgf ", %" NVgf
- "): negative time not invented yet",
- SvNV(accessed), SvNV(modified));
- Zero(&utbuf, sizeof utbuf, char);
-
- utbuf[0].tv_sec = (Time_t)SvNV(accessed); /* time accessed */
- utbuf[0].tv_nsec = (long)(
- (SvNV(accessed) - (NV)utbuf[0].tv_sec)
- * NV_1E9 + (NV)0.5);
-
- utbuf[1].tv_sec = (Time_t)SvNV(modified); /* time modified */
- utbuf[1].tv_nsec = (long)(
- (SvNV(modified) - (NV)utbuf[1].tv_sec)
- * NV_1E9 + (NV)0.5);
- }
-
- while (items > 0) {
- file = POPs; items--;
-
- if (SvROK(file) && GvIO(SvRV(file)) && IoIFP(sv_2io(SvRV(file)))) {
- int fd = PerlIO_fileno(IoIFP(sv_2io(file)));
- if (fd < 0) {
- SETERRNO(EBADF,RMS_IFI);
- } else {
-#ifdef HAS_FUTIMENS
- if (FUTIMENS_AVAILABLE) {
- if (futimens(fd, utbufp) == 0) {
- tot++;
- }
- } else {
- croak("futimens unimplemented in this platform");
- }
-#else /* HAS_FUTIMENS */
- croak("futimens unimplemented in this platform");
-#endif /* HAS_FUTIMENS */
+ accessed = ST(0);
+ modified = ST(1);
+ items -= 2;
+ tot = 0;
+
+ if ( accessed == &PL_sv_undef && modified == &PL_sv_undef )
+ utbufp = NULL;
+ else {
+ if (SvNV(accessed) < 0.0 || SvNV(modified) < 0.0)
+ croak("Time::HiRes::utime(%" NVgf ", %" NVgf
+ "): negative time not invented yet",
+ SvNV(accessed), SvNV(modified));
+ Zero(&utbuf, sizeof utbuf, char);
+
+ utbuf[0].tv_sec = (Time_t)SvNV(accessed); /* time accessed */
+ utbuf[0].tv_nsec = (long)(
+ (SvNV(accessed) - (NV)utbuf[0].tv_sec)
+ * NV_1E9 + (NV)0.5);
+
+ utbuf[1].tv_sec = (Time_t)SvNV(modified); /* time modified */
+ utbuf[1].tv_nsec = (long)(
+ (SvNV(modified) - (NV)utbuf[1].tv_sec)
+ * NV_1E9 + (NV)0.5);
+ }
+
+ while (items > 0) {
+ file = POPs; items--;
+
+ if (SvROK(file) && GvIO(SvRV(file)) && IoIFP(sv_2io(SvRV(file)))) {
+ int fd = PerlIO_fileno(IoIFP(sv_2io(file)));
+ if (fd < 0) {
+ SETERRNO(EBADF,RMS_IFI);
+ } else {
+# ifdef HAS_FUTIMENS
+ if (FUTIMENS_AVAILABLE) {
+ if (futimens(fd, utbufp) == 0) {
+ tot++;
}
- }
- else {
-#ifdef HAS_UTIMENSAT
- if (UTIMENSAT_AVAILABLE) {
+ } else {
+ croak("futimens unimplemented in this platform");
+ }
+# else /* HAS_FUTIMENS */
+ croak("futimens unimplemented in this platform");
+# endif /* HAS_FUTIMENS */
+ }
+ }
+ else {
+# ifdef HAS_UTIMENSAT
+ if (UTIMENSAT_AVAILABLE) {
STRLEN len;
char * name = SvPV(file, len);
if (IS_SAFE_PATHNAME(name, len, "utime") &&
utimensat(AT_FDCWD, name, utbufp, 0) == 0) {
- tot++;
+
+ tot++;
}
- } else {
+ } else {
croak("utimensat unimplemented in this platform");
- }
-#else /* HAS_UTIMENSAT */
- croak("utimensat unimplemented in this platform");
-#endif /* HAS_UTIMENSAT */
- }
- } /* while items */
- RETVAL = tot;
+ }
+# else /* HAS_UTIMENSAT */
+ croak("utimensat unimplemented in this platform");
+# endif /* HAS_UTIMENSAT */
+ }
+ } /* while items */
+ RETVAL = tot;
OUTPUT:
- RETVAL
+ RETVAL
#else /* #if defined(TIME_HIRES_UTIME) */
@@ -1507,7 +1558,7 @@ utime(accessed, modified, ...)
croak("Time::HiRes::utime(): unimplemented in this platform");
RETVAL = 0;
OUTPUT:
- RETVAL
+ RETVAL
#endif /* #if defined(TIME_HIRES_UTIME) */
@@ -1515,32 +1566,32 @@ utime(accessed, modified, ...)
NV
clock_gettime(clock_id = CLOCK_REALTIME)
- clockid_t clock_id
+ clockid_t clock_id
PREINIT:
- struct timespec ts;
- int status = -1;
+ struct timespec ts;
+ int status = -1;
CODE:
-#ifdef TIME_HIRES_CLOCK_GETTIME_SYSCALL
- status = syscall(SYS_clock_gettime, clock_id, &ts);
-#else
- status = clock_gettime(clock_id, &ts);
-#endif
- RETVAL = status == 0 ? ts.tv_sec + (NV) ts.tv_nsec / NV_1E9 : -1;
+# ifdef TIME_HIRES_CLOCK_GETTIME_SYSCALL
+ status = syscall(SYS_clock_gettime, clock_id, &ts);
+# else
+ status = clock_gettime(clock_id, &ts);
+# endif
+ RETVAL = status == 0 ? ts.tv_sec + (NV) ts.tv_nsec / NV_1E9 : -1;
OUTPUT:
- RETVAL
+ RETVAL
#else /* if defined(TIME_HIRES_CLOCK_GETTIME) */
NV
clock_gettime(clock_id = 0)
- clockid_t clock_id
+ clockid_t clock_id
CODE:
- PERL_UNUSED_ARG(clock_id);
+ PERL_UNUSED_ARG(clock_id);
croak("Time::HiRes::clock_gettime(): unimplemented in this platform");
RETVAL = 0.0;
OUTPUT:
- RETVAL
+ RETVAL
#endif /* #if defined(TIME_HIRES_CLOCK_GETTIME) */
@@ -1548,32 +1599,32 @@ clock_gettime(clock_id = 0)
NV
clock_getres(clock_id = CLOCK_REALTIME)
- clockid_t clock_id
+ clockid_t clock_id
PREINIT:
- int status = -1;
- struct timespec ts;
+ int status = -1;
+ struct timespec ts;
CODE:
-#ifdef TIME_HIRES_CLOCK_GETRES_SYSCALL
- status = syscall(SYS_clock_getres, clock_id, &ts);
-#else
- status = clock_getres(clock_id, &ts);
-#endif
- RETVAL = status == 0 ? ts.tv_sec + (NV) ts.tv_nsec / NV_1E9 : -1;
+# ifdef TIME_HIRES_CLOCK_GETRES_SYSCALL
+ status = syscall(SYS_clock_getres, clock_id, &ts);
+# else
+ status = clock_getres(clock_id, &ts);
+# endif
+ RETVAL = status == 0 ? ts.tv_sec + (NV) ts.tv_nsec / NV_1E9 : -1;
OUTPUT:
- RETVAL
+ RETVAL
#else /* if defined(TIME_HIRES_CLOCK_GETRES) */
NV
clock_getres(clock_id = 0)
- clockid_t clock_id
+ clockid_t clock_id
CODE:
- PERL_UNUSED_ARG(clock_id);
+ PERL_UNUSED_ARG(clock_id);
croak("Time::HiRes::clock_getres(): unimplemented in this platform");
RETVAL = 0.0;
OUTPUT:
- RETVAL
+ RETVAL
#endif /* #if defined(TIME_HIRES_CLOCK_GETRES) */
@@ -1581,39 +1632,39 @@ clock_getres(clock_id = 0)
NV
clock_nanosleep(clock_id, nsec, flags = 0)
- clockid_t clock_id
- NV nsec
- int flags
+ clockid_t clock_id
+ NV nsec
+ int flags
PREINIT:
- struct timespec sleepfor, unslept;
+ struct timespec sleepfor, unslept;
CODE:
- if (nsec < 0.0)
- croak("Time::HiRes::clock_nanosleep(..., %" NVgf
+ if (nsec < 0.0)
+ croak("Time::HiRes::clock_nanosleep(..., %" NVgf
"): negative time not invented yet", nsec);
nanosleep_init(nsec, &sleepfor, &unslept);
- if (clock_nanosleep(clock_id, flags, &sleepfor, &unslept) == 0) {
- RETVAL = nsec;
- } else {
+ if (clock_nanosleep(clock_id, flags, &sleepfor, &unslept) == 0) {
+ RETVAL = nsec;
+ } else {
RETVAL = nsec_without_unslept(&sleepfor, &unslept);
- }
+ }
OUTPUT:
- RETVAL
+ RETVAL
#else /* if defined(TIME_HIRES_CLOCK_NANOSLEEP) && defined(TIMER_ABSTIME) */
NV
clock_nanosleep(clock_id, nsec, flags = 0)
- clockid_t clock_id
- NV nsec
- int flags
+ clockid_t clock_id
+ NV nsec
+ int flags
CODE:
- PERL_UNUSED_ARG(clock_id);
- PERL_UNUSED_ARG(nsec);
- PERL_UNUSED_ARG(flags);
+ PERL_UNUSED_ARG(clock_id);
+ PERL_UNUSED_ARG(nsec);
+ PERL_UNUSED_ARG(flags);
croak("Time::HiRes::clock_nanosleep(): unimplemented in this platform");
RETVAL = 0.0;
OUTPUT:
- RETVAL
+ RETVAL
#endif /* #if defined(TIME_HIRES_CLOCK_NANOSLEEP) && defined(TIMER_ABSTIME) */
@@ -1622,13 +1673,13 @@ clock_nanosleep(clock_id, nsec, flags = 0)
NV
clock()
PREINIT:
- clock_t clocks;
+ clock_t clocks;
CODE:
- clocks = clock();
- RETVAL = clocks == (clock_t) -1 ? (clock_t) -1 : (NV)clocks / (NV)CLOCKS_PER_SEC;
+ clocks = clock();
+ RETVAL = clocks == (clock_t) -1 ? (clock_t) -1 : (NV)clocks / (NV)CLOCKS_PER_SEC;
OUTPUT:
- RETVAL
+ RETVAL
#else /* if defined(TIME_HIRES_CLOCK) && defined(CLOCKS_PER_SEC) */
@@ -1638,7 +1689,7 @@ clock()
croak("Time::HiRes::clock(): unimplemented in this platform");
RETVAL = 0.0;
OUTPUT:
- RETVAL
+ RETVAL
#endif /* #if defined(TIME_HIRES_CLOCK) && defined(CLOCKS_PER_SEC) */
@@ -1646,39 +1697,39 @@ void
stat(...)
PROTOTYPE: ;$
PREINIT:
- OP fakeop;
- int nret;
+ OP fakeop;
+ int nret;
ALIAS:
- Time::HiRes::lstat = 1
+ Time::HiRes::lstat = 1
PPCODE:
- XPUSHs(sv_2mortal(newSVsv(items == 1 ? ST(0) : DEFSV)));
- PUTBACK;
- ENTER;
- PL_laststatval = -1;
- SAVEOP();
- Zero(&fakeop, 1, OP);
- fakeop.op_type = ix ? OP_LSTAT : OP_STAT;
- fakeop.op_ppaddr = PL_ppaddr[fakeop.op_type];
- fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
- GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
- PL_op = &fakeop;
- (void)fakeop.op_ppaddr(aTHX);
- SPAGAIN;
- LEAVE;
- nret = SP+1 - &ST(0);
- if (nret == 13) {
- UV atime = SvUV(ST( 8));
- UV mtime = SvUV(ST( 9));
- UV ctime = SvUV(ST(10));
- UV atime_nsec;
- UV mtime_nsec;
- UV ctime_nsec;
- hrstatns(&atime_nsec, &mtime_nsec, &ctime_nsec);
- if (atime_nsec)
- ST( 8) = sv_2mortal(newSVnv(atime + (NV) atime_nsec / NV_1E9));
- if (mtime_nsec)
- ST( 9) = sv_2mortal(newSVnv(mtime + (NV) mtime_nsec / NV_1E9));
- if (ctime_nsec)
- ST(10) = sv_2mortal(newSVnv(ctime + (NV) ctime_nsec / NV_1E9));
- }
- XSRETURN(nret);
+ XPUSHs(sv_2mortal(newSVsv(items == 1 ? ST(0) : DEFSV)));
+ PUTBACK;
+ ENTER;
+ PL_laststatval = -1;
+ SAVEOP();
+ Zero(&fakeop, 1, OP);
+ fakeop.op_type = ix ? OP_LSTAT : OP_STAT;
+ fakeop.op_ppaddr = PL_ppaddr[fakeop.op_type];
+ fakeop.op_flags = GIMME_V == G_ARRAY ? OPf_WANT_LIST :
+ GIMME_V == G_SCALAR ? OPf_WANT_SCALAR : OPf_WANT_VOID;
+ PL_op = &fakeop;
+ (void)fakeop.op_ppaddr(aTHX);
+ SPAGAIN;
+ LEAVE;
+ nret = SP+1 - &ST(0);
+ if (nret == 13) {
+ UV atime = SvUV(ST( 8));
+ UV mtime = SvUV(ST( 9));
+ UV ctime = SvUV(ST(10));
+ UV atime_nsec;
+ UV mtime_nsec;
+ UV ctime_nsec;
+ hrstatns(&atime_nsec, &mtime_nsec, &ctime_nsec);
+ if (atime_nsec)
+ ST( 8) = sv_2mortal(newSVnv(atime + (NV) atime_nsec / NV_1E9));
+ if (mtime_nsec)
+ ST( 9) = sv_2mortal(newSVnv(mtime + (NV) mtime_nsec / NV_1E9));
+ if (ctime_nsec)
+ ST(10) = sv_2mortal(newSVnv(ctime + (NV) ctime_nsec / NV_1E9));
+ }
+ XSRETURN(nret);
diff --git a/Makefile.PL b/Makefile.PL
index 4e7018a..b635092 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -11,6 +11,8 @@ use Config;
use ExtUtils::MakeMaker;
use strict;
+use File::Spec;
+
my $VERBOSE = $ENV{VERBOSE};
my $DEFINE;
my $LIBS = [];
@@ -29,55 +31,6 @@ unless($ENV{PERL_CORE}) {
$ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
}
-# Perls 5.002 and 5.003 did not have File::Spec, fake what we need.
-
-sub my_dirsep {
- $^O eq 'VMS' ? '.' :
- $^O =~ /mswin32|netware|djgpp/i ? '\\' :
- $^O eq 'MacOS' ? ':'
- : '/';
-}
-
-sub my_catdir {
- shift;
- my $catdir = join(my_dirsep, @_);
- $^O eq 'VMS' ? "[$catdir]" : $catdir;
-}
-
-sub my_catfile {
- shift;
- return join(my_dirsep, @_) unless $^O eq 'VMS';
- my $file = pop;
- return my_catdir (undef, @_) . $file;
-}
-
-sub my_updir {
- shift;
- $^O eq 'VMS' ? "-" : "..";
-}
-
-BEGIN {
- eval { require File::Spec };
- if ($@) {
- *File::Spec::catdir = \&my_catdir;
- *File::Spec::updir = \&my_updir;
- *File::Spec::catfile = \&my_catfile;
- }
-}
-
-# Avoid 'used only once' warnings.
-my $nop1 = *File::Spec::catdir;
-my $nop2 = *File::Spec::updir;
-my $nop3 = *File::Spec::catfile;
-
-# if you have 5.004_03 (and some slightly older versions?), xsubpp
-# tries to generate line numbers in the C code generated from the .xs.
-# unfortunately, it is a little buggy around #ifdef'd code.
-# my choice is leave it in and have people with old perls complain
-# about the "Usage" bug, or leave it out and be unable to compile myself
-# without changing it, and then I'd always forget to change it before a
-# release. Sorry, Edward :)
-
sub try_compile_and_link {
my ($c, %args) = @_;
@@ -89,25 +42,25 @@ sub try_compile_and_link {
unlink("$tmp.c", "$tmp$obj_ext");
if (open(TMPC, '>', "$tmp.c")) {
- print TMPC $c;
- close(TMPC);
+ print TMPC $c;
+ close(TMPC);
- my $cccmd = $args{cccmd};
+ my $cccmd = $args{cccmd};
- my $errornull;
+ my $errornull;
- my $COREincdir;
+ my $COREincdir;
- if ($ENV{PERL_CORE}) {
- my $updir = File::Spec->updir;
- $COREincdir = File::Spec->catdir(($updir) x 2);
- } else {
- $COREincdir = File::Spec->catdir($Config{'archlibexp'}, 'CORE');
- }
+ if ($ENV{PERL_CORE}) {
+ my $updir = File::Spec->updir;
+ $COREincdir = File::Spec->catdir(($updir) x 2);
+ } else {
+ $COREincdir = File::Spec->catdir($Config{'archlibexp'}, 'CORE');
+ }
- if ($ENV{PERL_CORE}) {
- unless (-f File::Spec->catfile($COREincdir, "EXTERN.h")) {
- die <<__EOD__;
+ if ($ENV{PERL_CORE}) {
+ unless (-f File::Spec->catfile($COREincdir, "EXTERN.h")) {
+ die <<__EOD__;
Your environment variable PERL_CORE is '$ENV{PERL_CORE}' but there
is no EXTERN.h in $COREincdir.
Cannot continue, aborting.
@@ -115,62 +68,62 @@ __EOD__
}
}
- my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"
- . ' -DPERL_NO_INLINE_FUNCTIONS';
+ my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"
+ . ' -DPERL_NO_INLINE_FUNCTIONS';
- if ($^O eq 'VMS') {
+ if ($^O eq 'VMS') {
$cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c";
}
if ($args{silent} || !$VERBOSE) {
- $errornull = "2>/dev/null" unless defined $errornull;
- } else {
- $errornull = '';
- }
+ $errornull = "2>/dev/null" unless defined $errornull;
+ } else {
+ $errornull = '';
+ }
$cccmd = "$Config{'cc'} -o $tmp $ccflags $tmp.c @$LIBS $errornull"
- unless defined $cccmd;
+ unless defined $cccmd;
if ($^O eq 'VMS') {
- open( CMDFILE, '>', "$tmp.com" );
- print CMDFILE "\$ SET MESSAGE/NOFACILITY/NOSEVERITY/NOIDENT/NOTEXT\n";
- print CMDFILE "\$ $cccmd\n";
- print CMDFILE "\$ IF \$SEVERITY .NE. 1 THEN EXIT 44\n"; # escalate
- close CMDFILE;
- system("\@ $tmp.com");
- $ok = $?==0;
- for ("$tmp.c", "$tmp$obj_ext", "$tmp.com", "$tmp$Config{exe_ext}") {
- 1 while unlink $_;
- }
+ open( CMDFILE, '>', "$tmp.com" );
+ print CMDFILE "\$ SET MESSAGE/NOFACILITY/NOSEVERITY/NOIDENT/NOTEXT\n";
+ print CMDFILE "\$ $cccmd\n";
+ print CMDFILE "\$ IF \$SEVERITY .NE. 1 THEN EXIT 44\n"; # escalate
+ close CMDFILE;
+ system("\@ $tmp.com");
+ $ok = $?==0;
+ for ("$tmp.c", "$tmp$obj_ext", "$tmp.com", "$tmp$Config{exe_ext}") {
+ 1 while unlink $_;
+ }
}
else
{
- my $tmp_exe = "$tmp$ld_exeext";
- printf "cccmd = $cccmd\n" if $VERBOSE;
- my $res = system($cccmd);
- $ok = defined($res) && $res == 0 && -s $tmp_exe && -x _;
-
- if ( $ok && exists $args{run} && $args{run} && !$ENV{TIME_HIRES_DONT_RUN_PROBES} ) {
- my $tmp_exe =
- File::Spec->catfile(File::Spec->curdir, $tmp_exe);
- my @run = $tmp_exe;
- unshift @run, $Config{run} if $Config{run} && -e $Config{run};
- printf "Running $tmp_exe..." if $VERBOSE;
- if (system(@run) == 0) {
- $ok = 1;
- } else {
- $ok = 0;
- my $errno = $? >> 8;
- local $! = $errno;
- printf <<EOF;
+ my $tmp_exe = "$tmp$ld_exeext";
+ printf "cccmd = $cccmd\n" if $VERBOSE;
+ my $res = system($cccmd);
+ $ok = defined($res) && $res == 0 && -s $tmp_exe && -x _;
+
+ if ( $ok && exists $args{run} && $args{run} && !$ENV{TIME_HIRES_DONT_RUN_PROBES} ) {
+ my $tmp_exe =
+ File::Spec->catfile(File::Spec->curdir, $tmp_exe);
+ my @run = $tmp_exe;
+ unshift @run, $Config{run} if $Config{run} && -e $Config{run};
+ printf "Running $tmp_exe..." if $VERBOSE;
+ if (system(@run) == 0) {
+ $ok = 1;
+ } else {
+ $ok = 0;
+ my $errno = $? >> 8;
+ local $! = $errno;
+ printf <<EOF;
*** The test run of '$tmp_exe' failed: status $?
*** (the status means: errno = $errno or '$!')
*** DO NOT PANIC: this just means that *some* functionality will be missing.
EOF
- }
- }
- unlink("$tmp.c", $tmp_exe);
+ }
+ }
+ unlink("$tmp.c", $tmp_exe);
}
}
@@ -188,7 +141,7 @@ my $TIME_HEADERS = <<EOH;
# include <sys/time.h>
#endif
#ifdef I_SYS_SELECT
-# include <sys/select.h> /* struct timeval might be hidden in here */
+# include <sys/select.h> /* struct timeval might be hidden in here */
#endif
EOH
@@ -233,7 +186,7 @@ sub has_x {
int main(int argc, char** argv)
{
- $x;
+ $x;
}
EOM
return 0;
@@ -276,7 +229,7 @@ sub has_include {
#include <$inc>
int main(int argc, char** argv)
{
- return 0;
+ return 0;
}
EOM
return 0;
@@ -422,56 +375,56 @@ sub DEFINE {
my ($def, $val) = @_;
my $define = defined $val ? "$def=$val" : $def ;
unless ($DEFINE =~ /(?:^| )-D\Q$define\E(?: |$)/) {
- $DEFINE .= " -D$define";
+ $DEFINE .= " -D$define";
}
}
sub init {
my $hints = File::Spec->catfile("hints", "$^O.pl");
if (-f $hints) {
- print "Using hints $hints...\n";
- local $self;
- do "./$hints";
- if (exists $self->{LIBS}) {
- $LIBS = $self->{LIBS};
- print "Extra libraries: @$LIBS...\n";
- }
+ print "Using hints $hints...\n";
+ local $self;
+ do "./$hints";
+ if (exists $self->{LIBS}) {
+ $LIBS = $self->{LIBS};
+ print "Extra libraries: @$LIBS...\n";
+ }
}
$DEFINE = '';
if ($Config{d_syscall}) {
- print "Have syscall()... looking for syscall.h... ";
- if (has_include('syscall.h')) {
- $SYSCALL_H = 'syscall.h';
- } elsif (has_include('sys/syscall.h')) {
- $SYSCALL_H = 'sys/syscall.h';
- }
+ print "Have syscall()... looking for syscall.h... ";
+ if (has_include('syscall.h')) {
+ $SYSCALL_H = 'syscall.h';
+ } elsif (has_include('sys/syscall.h')) {
+ $SYSCALL_H = 'sys/syscall.h';
+ }
} else {
- print "No syscall()...\n";
+ print "No syscall()...\n";
}
if ($Config{d_syscall}) {
- if (defined $SYSCALL_H) {
- print "found <$SYSCALL_H>.\n";
- } else {
- print "NOT found.\n";
- }
+ if (defined $SYSCALL_H) {
+ print "found <$SYSCALL_H>.\n";
+ } else {
+ print "NOT found.\n";
+ }
}
print "Looking for gettimeofday()... ";
my $has_gettimeofday;
if (exists $Config{d_gettimeod}) {
- $has_gettimeofday++ if $Config{d_gettimeod};
+ $has_gettimeofday++ if $Config{d_gettimeod};
} elsif (has_gettimeofday()) {
- $DEFINE .= ' -DHAS_GETTIMEOFDAY';
- $has_gettimeofday++;
+ $DEFINE .= ' -DHAS_GETTIMEOFDAY';
+ $has_gettimeofday++;
}
if ($has_gettimeofday) {
- print "found.\n";
+ print "found.\n";
} else {
- die <<EOD
+ die <<EOD
Your operating system does not seem to have the gettimeofday() function.
(or, at least, I cannot find it)
@@ -496,7 +449,7 @@ EOD
if ($has_setitimer) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Looking for getitimer()... ";
@@ -511,13 +464,13 @@ EOD
if ($has_getitimer) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
if ($has_setitimer && $has_getitimer) {
- print "You have interval timers (both setitimer and getitimer).\n";
+ print "You have interval timers (both setitimer and getitimer).\n";
} else {
- print "You do NOT have interval timers.\n";
+ print "You do NOT have interval timers.\n";
}
print "Looking for ualarm()... ";
@@ -526,74 +479,71 @@ EOD
$has_ualarm++ if $Config{d_ualarm};
} elsif (has_x ("ualarm (0, 0)")) {
$has_ualarm++;
- $DEFINE .= ' -DHAS_UALARM';
+ $DEFINE .= ' -DHAS_UALARM';
}
if ($has_ualarm) {
print "found.\n";
} else {
- print "NOT found.\n";
- if ($has_setitimer) {
- print "But you have setitimer().\n";
- print "We can make a Time::HiRes::ualarm().\n";
- }
+ print "NOT found.\n";
+ if ($has_setitimer) {
+ print "But you have setitimer().\n";
+ print "We can make a Time::HiRes::ualarm().\n";
+ }
}
print "Looking for usleep()... ";
my $has_usleep;
if (exists $Config{d_usleep}) {
- $has_usleep++ if $Config{d_usleep};
+ $has_usleep++ if $Config{d_usleep};
} elsif (has_x ("usleep (0)")) {
- $has_usleep++;
- $DEFINE .= ' -DHAS_USLEEP';
+ $has_usleep++;
+ $DEFINE .= ' -DHAS_USLEEP';
}
if ($has_usleep) {
- print "found.\n";
+ print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
print "Let's see if you have select()... ";
if ($Config{'d_select'}) {
- print "found.\n";
- print "We can make a Time::HiRes::usleep().\n";
- } else {
- print "NOT found.\n";
- print "You won't have a Time::HiRes::usleep().\n";
- }
+ print "found.\n";
+ print "We can make a Time::HiRes::usleep().\n";
+ } else {
+ print "NOT found.\n";
+ print "You won't have a Time::HiRes::usleep().\n";
+ }
}
print "Looking for nanosleep()... ";
my $has_nanosleep;
if ($ENV{FORCE_NANOSLEEP_SCAN}) {
- print "forced scan... ";
- if (has_nanosleep()) {
- $has_nanosleep++;
- $DEFINE .= ' -DTIME_HIRES_NANOSLEEP';
- }
+ print "forced scan... ";
+ if (has_nanosleep()) {
+ $has_nanosleep++;
+ $DEFINE .= ' -DTIME_HIRES_NANOSLEEP';
+ }
}
elsif (exists $Config{d_nanosleep}) {
- print "believing \$Config{d_nanosleep}... ";
- if ($Config{d_nanosleep}) {
- $has_nanosleep++;
- $DEFINE .= ' -DTIME_HIRES_NANOSLEEP';
- }
- } elsif ($^O =~ /^(mpeix)$/) {
- # MPE/iX falsely finds nanosleep from its libc equivalent.
- print "skipping because in $^O... ";
+ print "believing \$Config{d_nanosleep}... ";
+ if ($Config{d_nanosleep}) {
+ $has_nanosleep++;
+ $DEFINE .= ' -DTIME_HIRES_NANOSLEEP';
+ }
} else {
- if (has_nanosleep()) {
- $has_nanosleep++;
- $DEFINE .= ' -DTIME_HIRES_NANOSLEEP';
- }
+ if (has_nanosleep()) {
+ $has_nanosleep++;
+ $DEFINE .= ' -DTIME_HIRES_NANOSLEEP';
+ }
}
if ($has_nanosleep) {
- print "found.\n";
+ print "found.\n";
print "You can mix subsecond sleeps with signals, if you want to.\n";
print "(It's still not portable, though.)\n";
} else {
- print "NOT found.\n";
- my $nt = ($^O eq 'os2' ? '' : 'not');
+ print "NOT found.\n";
+ my $nt = ($^O eq 'os2' ? '' : 'not');
print "You can$nt mix subsecond sleeps with signals.\n";
print "(It would not be portable anyway.)\n";
}
@@ -601,11 +551,11 @@ EOD
print "Looking for clockid_t... ";
my $has_clockid_t;
if (has_clockid_t()) {
- print "found.\n";
+ print "found.\n";
$has_clockid_t++;
- $DEFINE .= ' -DTIME_HIRES_CLOCKID_T';
+ $DEFINE .= ' -DTIME_HIRES_CLOCKID_T';
} else {
- print "NOT found, will use int.\n";
+ print "NOT found, will use int.\n";
}
print "Looking for clock_gettime()... ";
@@ -615,10 +565,10 @@ EOD
$has_clock_gettime++ if $Config{d_clock_gettime}; # Unlikely...
} elsif (has_clock_xxx('gettime')) {
$has_clock_gettime++;
- $DEFINE .= ' -DTIME_HIRES_CLOCK_GETTIME';
+ $DEFINE .= ' -DTIME_HIRES_CLOCK_GETTIME';
} elsif (defined $SYSCALL_H && has_clock_xxx_syscall('gettime')) {
$has_clock_gettime++;
- $DEFINE .= ' -DTIME_HIRES_CLOCK_GETTIME -DTIME_HIRES_CLOCK_GETTIME_SYSCALL';
+ $DEFINE .= ' -DTIME_HIRES_CLOCK_GETTIME -DTIME_HIRES_CLOCK_GETTIME_SYSCALL';
} elsif ($^O eq 'darwin') {
$has_clock_gettime_emulation++;
$has_clock_gettime++;
@@ -627,14 +577,14 @@ EOD
if ($has_clock_gettime) {
if ($DEFINE =~ /-DTIME_HIRES_CLOCK_GETTIME_SYSCALL/) {
- print "found (via syscall).\n";
- } elsif ($has_clock_gettime_emulation) {
- print "found (via emulation).\n";
- } else {
- print "found.\n";
- }
+ print "found (via syscall).\n";
+ } elsif ($has_clock_gettime_emulation) {
+ print "found (via emulation).\n";
+ } else {
+ print "found.\n";
+ }
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Looking for clock_getres()... ";
@@ -644,10 +594,10 @@ EOD
$has_clock_getres++ if $Config{d_clock_getres}; # Unlikely...
} elsif (has_clock_xxx('getres')) {
$has_clock_getres++;
- $DEFINE .= ' -DTIME_HIRES_CLOCK_GETRES';
+ $DEFINE .= ' -DTIME_HIRES_CLOCK_GETRES';
} elsif (defined $SYSCALL_H && has_clock_xxx_syscall('getres')) {
$has_clock_getres++;
- $DEFINE .= ' -DTIME_HIRES_CLOCK_GETRES -DTIME_HIRES_CLOCK_GETRES_SYSCALL';
+ $DEFINE .= ' -DTIME_HIRES_CLOCK_GETRES -DTIME_HIRES_CLOCK_GETRES_SYSCALL';
} elsif ($^O eq 'darwin') {
$has_clock_getres_emulation++;
$has_clock_getres++;
@@ -656,14 +606,14 @@ EOD
if ($has_clock_getres) {
if ($DEFINE =~ /-DTIME_HIRES_CLOCK_GETRES_SYSCALL/) {
- print "found (via syscall).\n";
- } elsif ($has_clock_getres_emulation) {
- print "found (via emulation).\n";
- } else {
- print "found.\n";
- }
+ print "found (via syscall).\n";
+ } elsif ($has_clock_getres_emulation) {
+ print "found (via emulation).\n";
+ } else {
+ print "found.\n";
+ }
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Looking for clock_nanosleep()... ";
@@ -673,21 +623,21 @@ EOD
$has_clock_nanosleep++ if $Config{d_clock_nanosleep}; # Unlikely...
} elsif (has_clock_nanosleep()) {
$has_clock_nanosleep++;
- $DEFINE .= ' -DTIME_HIRES_CLOCK_NANOSLEEP';
+ $DEFINE .= ' -DTIME_HIRES_CLOCK_NANOSLEEP';
} elsif ($^O eq 'darwin') {
$has_clock_nanosleep++;
$has_clock_nanosleep_emulation++;
- $DEFINE .= ' -DTIME_HIRES_CLOCK_NANOSLEEP -DTIME_HIRES_CLOCK_NANOSLEEP_EMULATION';
+ $DEFINE .= ' -DTIME_HIRES_CLOCK_NANOSLEEP -DTIME_HIRES_CLOCK_NANOSLEEP_EMULATION';
}
if ($has_clock_nanosleep) {
- if ($has_clock_nanosleep_emulation) {
- print "found (via emulation).\n";
- } else {
- print "found.\n";
- }
+ if ($has_clock_nanosleep_emulation) {
+ print "found (via emulation).\n";
+ } else {
+ print "found.\n";
+ }
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Looking for clock()... ";
@@ -696,44 +646,44 @@ EOD
$has_clock++ if $Config{d_clock}; # Unlikely...
} elsif (has_clock()) {
$has_clock++;
- $DEFINE .= ' -DTIME_HIRES_CLOCK';
+ $DEFINE .= ' -DTIME_HIRES_CLOCK';
}
if ($has_clock) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Looking for working futimens()... ";
my $has_futimens;
if (has_futimens()) {
$has_futimens++;
- $DEFINE .= ' -DHAS_FUTIMENS';
+ $DEFINE .= ' -DHAS_FUTIMENS';
}
if ($has_futimens) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Looking for working utimensat()... ";
my $has_utimensat;
if (has_utimensat()) {
$has_utimensat++;
- $DEFINE .= ' -DHAS_UTIMENSAT';
+ $DEFINE .= ' -DHAS_UTIMENSAT';
}
if ($has_utimensat) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
my $has_hires_utime = ($has_futimens && $has_utimensat);
if ($has_hires_utime) {
- $DEFINE .= ' -DTIME_HIRES_UTIME';
+ $DEFINE .= ' -DTIME_HIRES_UTIME';
print "You seem to have subsecond timestamp setting.\n";
} else {
print "You do NOT seem to have subsecond timestamp setting.\n";
@@ -758,7 +708,7 @@ EOM
if ($has_stat_st_xtimespec) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Trying struct stat st_atimensec...";
@@ -778,7 +728,7 @@ EOM
if ($has_stat_st_xtimensec) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Trying struct stat st_atime_n...";
@@ -798,7 +748,7 @@ EOM
if ($has_stat_st_xtime_n) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Trying struct stat st_atim.tv_nsec...";
@@ -818,7 +768,7 @@ EOM
if ($has_stat_st_xtim) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
print "Trying struct stat st_uatime...";
@@ -838,7 +788,7 @@ EOM
if ($has_stat_st_uxtime) {
print "found.\n";
} else {
- print "NOT found.\n";
+ print "NOT found.\n";
}
# See HiRes.xs hrstatns()
@@ -870,21 +820,21 @@ EOM
if ($^O eq 'cygwin') {
print "Looking for <w32api/windows.h>... ";
if (has_include('w32api/windows.h')) {
- $has_w32api_windows_h++;
- DEFINE('HAS_W32API_WINDOWS_H');
- }
+ $has_w32api_windows_h++;
+ DEFINE('HAS_W32API_WINDOWS_H');
+ }
if ($has_w32api_windows_h) {
- print "found.\n";
- } else {
- print "NOT found.\n";
- }
+ print "found.\n";
+ } else {
+ print "NOT found.\n";
+ }
}
if ($DEFINE) {
$DEFINE =~ s/^\s+//;
if (open(XDEFINE, '>', 'xdefine')) {
- print XDEFINE $DEFINE, "\n";
- close(XDEFINE);
+ print XDEFINE $DEFINE, "\n";
+ close(XDEFINE);
}
}
}
@@ -892,74 +842,82 @@ EOM
sub doMakefile {
my @makefileopts = ();
- if ($] >= 5.005) {
- push (@makefileopts,
- 'AUTHOR' => 'Jarkko Hietaniemi <jhi@iki.fi>',
- 'ABSTRACT_FROM' => 'HiRes.pm',
- );
- DEFINE('ATLEASTFIVEOHOHFIVE');
- }
DEFINE('USE_PPPORT_H') unless $ENV{PERL_CORE};
push (@makefileopts,
- 'NAME' => 'Time::HiRes',
- 'VERSION_FROM' => 'HiRes.pm', # finds $VERSION
- 'LIBS' => $LIBS, # e.g., '-lm'
- 'DEFINE' => $DEFINE, # e.g., '-DHAS_SOMETHING'
- 'XSOPT' => $XSOPT,
- # Do not even think about 'INC' => '-I/usr/ucbinclude',
- # Solaris will avenge.
- 'INC' => '', # e.g., '-I/usr/include/other'
- 'INSTALLDIRS' => ($] >= 5.008 && $] < 5.011 ? 'perl' : 'site'),
- 'PREREQ_PM' => {
- 'Carp' => 0,
- 'Config' => 0,
- 'Exporter' => 0,
- 'ExtUtils::MakeMaker' => 0,
- 'Test::More' => 0,
- 'XSLoader' => 0,
- 'strict' => 0,
- },
- 'dist' => {
- 'CI' => 'ci -l',
- 'COMPRESS' => 'gzip -9f',
- 'SUFFIX' => 'gz',
- },
+ 'NAME' => 'Time::HiRes',
+ 'AUTHOR' => 'Jarkko Hietaniemi <jhi@iki.fi>',
+ 'ABSTRACT_FROM' => 'HiRes.pm',
+ 'VERSION_FROM' => 'HiRes.pm', # finds $VERSION
+ 'LIBS' => $LIBS, # e.g., '-lm'
+ 'DEFINE' => $DEFINE, # e.g., '-DHAS_SOMETHING'
+ 'XSOPT' => $XSOPT,
+ # Do not even think about 'INC' => '-I/usr/ucbinclude',
+ # Solaris will avenge.
+ 'INC' => '', # e.g., '-I/usr/include/other'
+ 'INSTALLDIRS' => ($] >= 5.008 && $] < 5.011 ? 'perl' : 'site'),
+ 'PREREQ_PM' => {
+ 'Carp' => 0,
+ 'Config' => 0,
+ 'Exporter' => 0,
+ 'ExtUtils::MakeMaker' => 0,
+ 'Test::More' => 0,
+ 'XSLoader' => 0,
+ 'strict' => 0,
+ 'File::Spec' => 0,
+ },
+ 'dist' => {
+ 'CI' => 'ci -l',
+ 'COMPRESS' => 'gzip -9f',
+ 'SUFFIX' => 'gz',
+ },
clean => { FILES => "xdefine" },
realclean => { FILES=> 'const-c.inc const-xs.inc' },
);
if ($^O eq "MSWin32" && !(grep { /\ALD[A-Z]*=/ } @ARGV)) {
- my $libperl = $Config{libperl} || "";
- my $gccversion = $Config{gccversion} || "";
- if ($gccversion =~ /\A3\.4\.[0-9]+/ and $libperl =~ /\.lib\z/) {
- # Avoid broken linkage with ActivePerl, by linking directly
- # against the Perl DLL rather than the import library.
- (my $llibperl = "-l$libperl") =~ s/\.lib\z//;
- my $lddlflags = $Config{lddlflags} || "";
- my $ldflags = $Config{ldflags} || "";
- s/-L(?:".*?"|\S+)//g foreach $lddlflags, $ldflags;
- my $libdirs = join ' ',
- map { s/(?<!\\)((?:\\\\)*")/\\$1/g; qq[-L"$_"] }
- @Config{qw/bin sitebin/};
- push @makefileopts, macro => {
- LDDLFLAGS => "$lddlflags $libdirs $llibperl",
- LDFLAGS => "$ldflags $libdirs $llibperl",
- PERL_ARCHIVE => "",
- };
- }
+ my $libperl = $Config{libperl} || "";
+ my $gccversion = $Config{gccversion} || "";
+ if ($gccversion =~ /\A3\.4\.[0-9]+/ and $libperl =~ /\.lib\z/) {
+ # Avoid broken linkage with ActivePerl, by linking directly
+ # against the Perl DLL rather than the import library.
+ (my $llibperl = "-l$libperl") =~ s/\.lib\z//;
+ my $lddlflags = $Config{lddlflags} || "";
+ my $ldflags = $Config{ldflags} || "";
+ s/-L(?:".*?"|\S+)//g foreach $lddlflags, $ldflags;
+ my $libdirs = join ' ',
+ map { s/(?<!\\)((?:\\\\)*")/\\$1/g; qq[-L"$_"] }
+ @Config{qw/bin sitebin/};
+ push @makefileopts, macro => {
+ LDDLFLAGS => "$lddlflags $libdirs $llibperl",
+ LDFLAGS => "$ldflags $libdirs $llibperl",
+ PERL_ARCHIVE => "",
+ };
+ }
}
if ($ENV{PERL_CORE}) {
- push @makefileopts, MAN3PODS => {};
+ push @makefileopts, MAN3PODS => {};
}
if ($ExtUtils::MakeMaker::VERSION >= 6.48) {
- push @makefileopts, (MIN_PERL_VERSION => '5.006',);
+ push @makefileopts, (MIN_PERL_VERSION => '5.006',);
}
if ($ExtUtils::MakeMaker::VERSION >= 6.31) {
- push @makefileopts, (LICENSE => 'perl_5');
+ push @makefileopts, (LICENSE => 'perl_5');
+ }
+
+ if ($ExtUtils::MakeMaker::VERSION >= 6.46) {
+ push @makefileopts, (
+ META_MERGE => {
+ resources => {
+ repository => 'git://perl5.git.perl.org/perl.git',
+ bugtracker => 'https://rt.perl.org/rt3/',
+ homepage => "http://dev.perl.org/",
+ },
+ },
+ )
}
WriteMakefile(@makefileopts);
@@ -968,119 +926,122 @@ sub doMakefile {
sub doConstants {
if (eval {require ExtUtils::Constant; 1}) {
# More or less this same list is in HiRes.pm. Should unify.
- my @names = qw(
- CLOCKS_PER_SEC
- CLOCK_BOOTTIME
- CLOCK_HIGHRES
- CLOCK_MONOTONIC
- CLOCK_MONOTONIC_COARSE
- CLOCK_MONOTONIC_FAST
- CLOCK_MONOTONIC_PRECISE
- CLOCK_MONOTONIC_RAW
- CLOCK_PROF
- CLOCK_PROCESS_CPUTIME_ID
- CLOCK_REALTIME
- CLOCK_REALTIME_COARSE
- CLOCK_REALTIME_FAST
- CLOCK_REALTIME_PRECISE
- CLOCK_REALTIME_RAW
- CLOCK_SECOND
- CLOCK_SOFTTIME
- CLOCK_THREAD_CPUTIME_ID
- CLOCK_TIMEOFDAY
- CLOCK_UPTIME
- CLOCK_UPTIME_COARSE
- CLOCK_UPTIME_FAST
- CLOCK_UPTIME_PRECISE
- CLOCK_UPTIME_RAW
- CLOCK_VIRTUAL
- ITIMER_PROF
- ITIMER_REAL
- ITIMER_REALPROF
- ITIMER_VIRTUAL
- TIMER_ABSTIME
+ my @names = qw(
+ CLOCKS_PER_SEC
+ CLOCK_BOOTTIME
+ CLOCK_HIGHRES
+ CLOCK_MONOTONIC
+ CLOCK_MONOTONIC_COARSE
+ CLOCK_MONOTONIC_FAST
+ CLOCK_MONOTONIC_PRECISE
+ CLOCK_MONOTONIC_RAW
+ CLOCK_PROF
+ CLOCK_PROCESS_CPUTIME_ID
+ CLOCK_REALTIME
+ CLOCK_REALTIME_COARSE
+ CLOCK_REALTIME_FAST
+ CLOCK_REALTIME_PRECISE
+ CLOCK_REALTIME_RAW
+ CLOCK_SECOND
+ CLOCK_SOFTTIME
+ CLOCK_THREAD_CPUTIME_ID
+ CLOCK_TIMEOFDAY
+ CLOCK_UPTIME
+ CLOCK_UPTIME_COARSE
+ CLOCK_UPTIME_FAST
+ CLOCK_UPTIME_PRECISE
+ CLOCK_UPTIME_RAW
+ CLOCK_VIRTUAL
+ ITIMER_PROF
+ ITIMER_REAL
+ ITIMER_REALPROF
+ ITIMER_VIRTUAL
+ TIMER_ABSTIME
);
- foreach (qw (d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
- d_nanosleep d_clock_gettime d_clock_getres
- d_clock d_clock_nanosleep d_hires_stat
+ foreach (qw (d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
+ d_nanosleep d_clock_gettime d_clock_getres
+ d_clock d_clock_nanosleep d_hires_stat
d_futimens d_utimensat d_hires_utime)) {
- my $macro = $_;
- if ($macro =~ /^(d_nanosleep|d_clock)$/) {
- $macro =~ s/^d_(.+)/TIME_HIRES_\U$1/;
- } elsif ($macro =~ /^(d_hires_stat)$/) {
- my $d_hires_stat = $1 if ($DEFINE =~ /-DTIME_HIRES_STAT=(\d+)/);
+ my $macro = $_;
+ if ($macro =~ /^(d_nanosleep|d_clock)$/) {
+ $macro =~ s/^d_(.+)/TIME_HIRES_\U$1/;
+ } elsif ($macro =~ /^(d_hires_stat)$/) {
+ my $d_hires_stat = $1 if ($DEFINE =~ /-DTIME_HIRES_STAT=(\d+)/);
if (defined $d_hires_stat) {
push @names, {name => $_, macro => "TIME_HIRES_STAT", value => $d_hires_stat,
default => ["IV", "0"]};
next;
}
- } elsif ($macro =~ /^(d_hires_utime)$/) {
- my $d_hires_utime =
- ($DEFINE =~ /-DHAS_FUTIMENS/ ||
- $DEFINE =~ /-DHAS_UTIMENSAT/);
- push @names, {name => $_, macro => "TIME_HIRES_UTIME", value => $d_hires_utime,
- default => ["IV", "0"]};
- next;
- } elsif ($macro =~ /^(d_clock_gettime|d_clock_getres|d_clock_nanosleep)$/) {
- $macro =~ s/^d_(.+)/TIME_HIRES_\U$1/;
- my $val = ($DEFINE =~ /-D$macro\b/) ? 1 : 0;
- push @names, {name => $_, macro => $macro, value => $val,
- default => ["IV", "0"]};
- next;
- } else {
- $macro =~ s/^d_(.+)/HAS_\U$1/;
- }
- push @names, {name => $_, macro => $macro, value => 1,
- default => ["IV", "0"]};
- }
- ExtUtils::Constant::WriteConstants(
- NAME => 'Time::HiRes',
- NAMES => \@names,
- );
+ } elsif ($macro =~ /^(d_hires_utime)$/) {
+ my $d_hires_utime =
+ ($DEFINE =~ /-DHAS_FUTIMENS/ ||
+ $DEFINE =~ /-DHAS_UTIMENSAT/);
+ push @names, {name => $_, macro => "TIME_HIRES_UTIME", value => $d_hires_utime,
+ default => ["IV", "0"]};
+ next;
+ } elsif ($macro =~ /^(d_clock_gettime|d_clock_getres|d_clock_nanosleep)$/) {
+ $macro =~ s/^d_(.+)/TIME_HIRES_\U$1/;
+ my $val = ($DEFINE =~ /-D$macro\b/) ? 1 : 0;
+ push @names, {name => $_, macro => $macro, value => $val,
+ default => ["IV", "0"]};
+ next;
+ } else {
+ $macro =~ s/^d_(.+)/HAS_\U$1/;
+ }
+ push @names, {name => $_, macro => $macro, value => 1,
+ default => ["IV", "0"]};
+ }
+ ExtUtils::Constant::WriteConstants(
+ NAME => 'Time::HiRes',
+ NAMES => \@names,
+ );
} else {
my $file;
- foreach $file ('const-c.inc', 'const-xs.inc') {
- my $fallback = File::Spec->catfile('fallback', $file);
- local $/;
- open IN, '<', $fallback or die "Can't open $fallback: $!";
- open OUT, '>', $file or die "Can't open $file: $!";
- print OUT <IN> or die $!;
- close OUT or die "Can't close $file: $!";
- close IN or die "Can't close $fallback: $!";
- }
+ foreach $file ('const-c.inc', 'const-xs.inc') {
+ my $fallback = File::Spec->catfile('fallback', $file);
+ local $/;
+ open IN, '<', $fallback or die "Can't open $fallback: $!";
+ open OUT, '>', $file or die "Can't open $file: $!";
+ print OUT <IN> or die $!;
+ close OUT or die "Can't close $file: $!";
+ close IN or die "Can't close $fallback: $!";
+ }
}
}
sub main {
if (-f "xdefine" && !(@ARGV && $ARGV[0] =~ /^--(?:configure|force)$/)) {
- print qq[$0: The "xdefine" exists, skipping the configure step.\n];
- print qq[Use "$^X $0 --configure"\n];
- print qq[or: "$^X $0 --force\n];
- print qq[to force the configure step.\n];
+ print qq[$0: The "xdefine" exists, skipping the configure step.\n];
+ print qq[Use "$^X $0 --configure"\n];
+ print qq[or: "$^X $0 --force\n];
+ print qq[to force the configure step.\n];
} else {
- print "Configuring Time::HiRes...\n";
- 1 while unlink("define");
- if ($^O =~ /Win32/i) {
- DEFINE('SELECT_IS_BROKEN');
- $LIBS = [];
- print "System is $^O, skipping full configure...\n";
- open(XDEFINE, '>', 'xdefine') or die "$0: Cannot create xdefine: $!\n";
- close(XDEFINE);
- } else {
- init();
- }
- doMakefile;
- doConstants;
+ print "Configuring Time::HiRes...\n";
+ 1 while unlink("define");
+ if ($^O =~ /Win32/i) {
+ DEFINE('SELECT_IS_BROKEN');
+ # we provide our own implementations of those functions on win32
+ DEFINE('TIME_HIRES_CLOCK_GETTIME');
+ DEFINE('TIME_HIRES_CLOCK_GETRES');
+ $LIBS = [];
+ print "System is $^O, skipping full configure...\n";
+ open(XDEFINE, '>', 'xdefine') or die "$0: Cannot create xdefine: $!\n";
+ close(XDEFINE);
+ } else {
+ init();
+ }
+ doMakefile;
+ doConstants;
}
my $make = $Config{'make'} || "make";
unless (exists $ENV{PERL_CORE} && $ENV{PERL_CORE}) {
- print <<EOM;
+ print <<EOM;
Now you may issue '$make'. Do not forget also '$make test'.
EOM
if ($] == 5.008 &&
- ((exists $ENV{LC_ALL} && $ENV{LC_ALL} =~ /utf-?8/i) ||
- (exists $ENV{LC_CTYPE} && $ENV{LC_CTYPE} =~ /utf-?8/i) ||
- (exists $ENV{LANG} && $ENV{LANG} =~ /utf-?8/i))) {
+ ((exists $ENV{LC_ALL} && $ENV{LC_ALL} =~ /utf-?8/i) ||
+ (exists $ENV{LC_CTYPE} && $ENV{LC_CTYPE} =~ /utf-?8/i) ||
+ (exists $ENV{LANG} && $ENV{LANG} =~ /utf-?8/i))) {
print <<EOM;
NOTE: if you get an error like this (the Makefile line number may vary):
diff --git a/t/Watchdog.pm b/t/Watchdog.pm
index 44ec808..a93ab4f 100644
--- a/t/Watchdog.pm
+++ b/t/Watchdog.pm
@@ -13,24 +13,24 @@ if ($Config{d_fork}) {
print("# I am the main process $$, starting the watchdog process...\n");
$watchdog_pid = fork();
if (defined $watchdog_pid) {
- if ($watchdog_pid == 0) { # We are the kid, set up the watchdog.
- my $ppid = getppid();
- print("# I am the watchdog process $$, sleeping for $waitfor seconds...\n");
- sleep($waitfor - 2); # Workaround for perlbug #49073
- sleep(2); # Wait for parent to exit
- if (kill(0, $ppid)) { # Check if parent still exists
- warn "\n$0: overall time allowed for tests (${waitfor}s) exceeded!\n";
- print("Terminating main process $ppid...\n");
- kill('KILL', $ppid);
- print("# This is the watchdog process $$, over and out.\n");
- }
- exit(0);
- } else {
- print("# The watchdog process $watchdog_pid launched, continuing testing...\n");
- $TheEnd = time() + $waitfor;
- }
+ if ($watchdog_pid == 0) { # We are the kid, set up the watchdog.
+ my $ppid = getppid();
+ print("# I am the watchdog process $$, sleeping for $waitfor seconds...\n");
+ sleep($waitfor - 2); # Workaround for perlbug #49073
+ sleep(2); # Wait for parent to exit
+ if (kill(0, $ppid)) { # Check if parent still exists
+ warn "\n$0: overall time allowed for tests (${waitfor}s) exceeded!\n";
+ print("Terminating main process $ppid...\n");
+ kill('KILL', $ppid);
+ print("# This is the watchdog process $$, over and out.\n");
+ }
+ exit(0);
+ } else {
+ print("# The watchdog process $watchdog_pid launched, continuing testing...\n");
+ $TheEnd = time() + $waitfor;
+ }
} else {
- warn "$0: fork failed: $!\n";
+ warn "$0: fork failed: $!\n";
}
} else {
print("# No watchdog process (need fork)\n");
@@ -38,16 +38,16 @@ if ($Config{d_fork}) {
END {
if ($watchdog_pid) { # Only in the main process.
- my $left = $TheEnd - time();
- 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);
- if (kill(0, $watchdog_pid)) {
- local $? = 0;
- my $kill = kill('KILL', $watchdog_pid); # We are done, the watchdog can go.
- wait();
- printf("# kill KILL $watchdog_pid = %d\n", $kill);
- }
- unlink("ktrace.out"); # Used in BSD system call tracing.
- print("# All done.\n");
+ my $left = $TheEnd - time();
+ 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);
+ if (kill(0, $watchdog_pid)) {
+ local $? = 0;
+ my $kill = kill('KILL', $watchdog_pid); # We are done, the watchdog can go.
+ wait();
+ printf("# kill KILL $watchdog_pid = %d\n", $kill);
+ }
+ unlink("ktrace.out"); # Used in BSD system call tracing.
+ print("# All done.\n");
}
}
diff --git a/t/alarm.t b/t/alarm.t
index af34d2a..6ebf380 100644
--- a/t/alarm.t
+++ b/t/alarm.t
@@ -10,23 +10,23 @@ use Config;
my $limit = 0.25; # 25% is acceptable slosh for testing timers
-my $xdefine = '';
+my $xdefine = '';
if (open(XDEFINE, "<", "xdefine")) {
chomp($xdefine = <XDEFINE> || "");
close(XDEFINE);
}
my $can_subsecond_alarm =
- defined &Time::HiRes::gettimeofday &&
- defined &Time::HiRes::ualarm &&
- defined &Time::HiRes::usleep &&
- ($Config{d_ualarm} || $xdefine =~ /-DHAS_UALARM/);
+ defined &Time::HiRes::gettimeofday &&
+ defined &Time::HiRes::ualarm &&
+ defined &Time::HiRes::usleep &&
+ ($Config{d_ualarm} || $xdefine =~ /-DHAS_UALARM/);
SKIP: {
skip "no subsecond alarm", 1 unless $can_subsecond_alarm;
eval { require POSIX };
my $use_sigaction =
- !$@ && defined &POSIX::sigaction && &POSIX::SIGALRM > 0;
+ !$@ && defined &POSIX::sigaction && &POSIX::SIGALRM > 0;
my ($r, $i, $not, $ok);
@@ -36,80 +36,80 @@ SKIP: {
$i = 5;
my $oldaction;
if ($use_sigaction) {
- $oldaction = new POSIX::SigAction;
- printf("# sigaction tick, ALRM = %d\n", &POSIX::SIGALRM);
+ $oldaction = new POSIX::SigAction;
+ printf("# sigaction tick, ALRM = %d\n", &POSIX::SIGALRM);
- # Perl's deferred signals may be too wimpy to break through
- # a restartable select(), so use POSIX::sigaction if available.
+ # Perl's deferred signals may be too wimpy to break through
+ # a restartable select(), so use POSIX::sigaction if available.
# In perl 5.6.2 you will get a likely bogus warning of
# "Use of uninitialized value in subroutine entry" from
# the following line.
- POSIX::sigaction(&POSIX::SIGALRM,
- POSIX::SigAction->new("tick"),
- $oldaction)
- or die "Error setting SIGALRM handler with sigaction: $!\n";
+ POSIX::sigaction(&POSIX::SIGALRM,
+ POSIX::SigAction->new("tick"),
+ $oldaction)
+ or die "Error setting SIGALRM handler with sigaction: $!\n";
} else {
- print("# SIG tick\n");
- $SIG{ALRM} = "tick";
+ print("# SIG tick\n");
+ $SIG{ALRM} = "tick";
}
# On VMS timers can not interrupt select.
if ($^O eq 'VMS') {
- $ok = "Skip: VMS select() does not get interrupted.";
+ $ok = "Skip: VMS select() does not get interrupted.";
} else {
- while ($i > 0) {
- Time::HiRes::alarm(0.3);
- select (undef, undef, undef, 3);
- my $ival = Time::HiRes::tv_interval ($r);
- print("# Select returned! $i $ival\n");
- printf("# %s\n", abs($ival/3 - 1));
- # Whether select() gets restarted after signals is
- # implementation dependent. If it is restarted, we
- # will get about 3.3 seconds: 3 from the select, 0.3
- # from the alarm. If this happens, let's just skip
- # this particular test. --jhi
- if (abs($ival/3.3 - 1) < $limit) {
- $ok = "Skip: your select() may get restarted by your SIGALRM (or just retry test)";
- undef $not;
- last;
- }
- my $exp = 0.3 * (5 - $i);
- if ($exp == 0) {
- $not = "while: divisor became zero";
- last;
- }
- # This test is more sensitive, so impose a softer limit.
- if (abs($ival/$exp - 1) > 4*$limit) {
- my $ratio = abs($ival/$exp);
- $not = "while: $exp sleep took $ival ratio $ratio";
- last;
- }
- $ok = $i;
- }
+ while ($i > 0) {
+ Time::HiRes::alarm(0.3);
+ select (undef, undef, undef, 3);
+ my $ival = Time::HiRes::tv_interval ($r);
+ print("# Select returned! $i $ival\n");
+ printf("# %s\n", abs($ival/3 - 1));
+ # Whether select() gets restarted after signals is
+ # implementation dependent. If it is restarted, we
+ # will get about 3.3 seconds: 3 from the select, 0.3
+ # from the alarm. If this happens, let's just skip
+ # this particular test. --jhi
+ if (abs($ival/3.3 - 1) < $limit) {
+ $ok = "Skip: your select() may get restarted by your SIGALRM (or just retry test)";
+ undef $not;
+ last;
+ }
+ my $exp = 0.3 * (5 - $i);
+ if ($exp == 0) {
+ $not = "while: divisor became zero";
+ last;
+ }
+ # This test is more sensitive, so impose a softer limit.
+ if (abs($ival/$exp - 1) > 4*$limit) {
+ my $ratio = abs($ival/$exp);
+ $not = "while: $exp sleep took $ival ratio $ratio";
+ last;
+ }
+ $ok = $i;
+ }
}
sub tick {
- $i--;
- my $ival = Time::HiRes::tv_interval ($r);
- print("# Tick! $i $ival\n");
- my $exp = 0.3 * (5 - $i);
- if ($exp == 0) {
- $not = "tick: divisor became zero";
- last;
- }
- # This test is more sensitive, so impose a softer limit.
- if (abs($ival/$exp - 1) > 4*$limit) {
- my $ratio = abs($ival/$exp);
- $not = "tick: $exp sleep took $ival ratio $ratio";
- $i = 0;
- }
+ $i--;
+ my $ival = Time::HiRes::tv_interval ($r);
+ print("# Tick! $i $ival\n");
+ my $exp = 0.3 * (5 - $i);
+ if ($exp == 0) {
+ $not = "tick: divisor became zero";
+ last;
+ }
+ # This test is more sensitive, so impose a softer limit.
+ if (abs($ival/$exp - 1) > 4*$limit) {
+ my $ratio = abs($ival/$exp);
+ $not = "tick: $exp sleep took $ival ratio $ratio";
+ $i = 0;
+ }
}
if ($use_sigaction) {
- POSIX::sigaction(&POSIX::SIGALRM, $oldaction);
+ POSIX::sigaction(&POSIX::SIGALRM, $oldaction);
} else {
- Time::HiRes::alarm(0); # can't cancel usig %SIG
+ Time::HiRes::alarm(0); # can't cancel usig %SIG
}
print("# $not\n");
@@ -120,7 +120,7 @@ SKIP: {
skip "no ualarm", 1 unless &Time::HiRes::d_ualarm;
eval { Time::HiRes::alarm(-3) };
like $@, qr/::alarm\(-3, 0\): negative time not invented yet/,
- "negative time error";
+ "negative time error";
}
# Find the loop size N (a for() loop 0..N-1)
@@ -139,22 +139,22 @@ SKIP: {
my $i;
N: {
do {
- my $t0 = Time::HiRes::time();
- for ($i = 0; $i < $DelayN; $i++) { }
- my $t1 = Time::HiRes::time();
- my $dt = $t1 - $t0;
- print("# N = $DelayN, t1 = $t1, t0 = $t0, dt = $dt\n");
- last N if $dt > $T;
- $DelayN *= 2;
+ my $t0 = Time::HiRes::time();
+ for ($i = 0; $i < $DelayN; $i++) { }
+ my $t1 = Time::HiRes::time();
+ my $dt = $t1 - $t0;
+ print("# N = $DelayN, t1 = $t1, t0 = $t0, dt = $dt\n");
+ last N if $dt > $T;
+ $DelayN *= 2;
} while (1);
}
# The time-burner which takes at least T (default 1) seconds.
my $Delay = sub {
- my $c = @_ ? shift : 1;
- my $n = $c * $DelayN;
- my $i;
- for ($i = 0; $i < $n; $i++) { }
+ my $c = @_ ? shift : 1;
+ my $n = $c * $DelayN;
+ my $i;
+ for ($i = 0; $i < $n; $i++) { }
};
# Next setup a periodic timer (the two-argument alarm() of
@@ -174,11 +174,11 @@ SKIP: {
# (We may well get $A + 1 alarms.)
$SIG{ALRM} = sub {
- $a++;
- printf("# Alarm $a - %s\n", Time::HiRes::time());
- Time::HiRes::alarm(0) if $a >= $A; # Disarm the alarm.
- $Delay->(2); # Try burning CPU at least for 2T seconds.
- };
+ $a++;
+ printf("# Alarm $a - %s\n", Time::HiRes::time());
+ Time::HiRes::alarm(0) if $a >= $A; # Disarm the alarm.
+ $Delay->(2); # Try burning CPU at least for 2T seconds.
+ };
Time::HiRes::alarm($T, $T); # Arm the alarm.
@@ -190,38 +190,38 @@ SKIP: {
SKIP: {
skip "no subsecond alarm", 6 unless $can_subsecond_alarm;
{
- my $alrm;
- $SIG{ALRM} = sub { $alrm++ };
- Time::HiRes::alarm(0.1);
- my $t0 = Time::HiRes::time();
- 1 while Time::HiRes::time() - $t0 <= 1;
- ok $alrm;
+ my $alrm;
+ $SIG{ALRM} = sub { $alrm++ };
+ Time::HiRes::alarm(0.1);
+ my $t0 = Time::HiRes::time();
+ 1 while Time::HiRes::time() - $t0 <= 1;
+ ok $alrm;
}
{
- my $alrm;
- $SIG{ALRM} = sub { $alrm++ };
- Time::HiRes::alarm(1.1);
- my $t0 = Time::HiRes::time();
- 1 while Time::HiRes::time() - $t0 <= 2;
- ok $alrm;
+ my $alrm;
+ $SIG{ALRM} = sub { $alrm++ };
+ Time::HiRes::alarm(1.1);
+ my $t0 = Time::HiRes::time();
+ 1 while Time::HiRes::time() - $t0 <= 2;
+ ok $alrm;
}
{
- my $alrm = 0;
- $SIG{ALRM} = sub { $alrm++ };
- my $got = Time::HiRes::alarm(2.7);
- ok $got == 0 or print("# $got\n");
+ my $alrm = 0;
+ $SIG{ALRM} = sub { $alrm++ };
+ my $got = Time::HiRes::alarm(2.7);
+ ok $got == 0 or print("# $got\n");
- my $t0 = Time::HiRes::time();
- 1 while Time::HiRes::time() - $t0 <= 1;
+ my $t0 = Time::HiRes::time();
+ 1 while Time::HiRes::time() - $t0 <= 1;
- $got = Time::HiRes::alarm(0);
- ok $got > 0 && $got < 1.8 or print("# $got\n");
+ $got = Time::HiRes::alarm(0);
+ ok $got > 0 && $got < 1.8 or print("# $got\n");
- ok $alrm == 0 or print("# $alrm\n");
+ ok $alrm == 0 or print("# $alrm\n");
- $got = Time::HiRes::alarm(0);
- ok $got == 0 or print("# $got\n");
+ $got = Time::HiRes::alarm(0);
+ ok $got == 0 or print("# $got\n");
}
}
diff --git a/t/clock.t b/t/clock.t
index 64478b0..810d63a 100644
--- a/t/clock.t
+++ b/t/clock.t
@@ -22,7 +22,7 @@ printf("# have_clock = %d\n", &Time::HiRes::d_clock);
# Ideally, we'd like to test that the timers are rather precise.
# However, if the system is busy, there are no guarantees on how
# quickly we will return. This limit used to be 10%, but that
-# was occasionally triggered falsely.
+# was occasionally triggered falsely.
# So let's try 25%.
# Another possibility might be to print "ok" if the test completes fine
# with (say) 10% slosh, "skip - system may have been busy?" if the test
@@ -33,31 +33,31 @@ my $limit = 0.25; # 25% is acceptable slosh for testing timers
SKIP: {
skip "no clock_gettime", 1
- unless &Time::HiRes::d_clock_gettime && has_symbol("CLOCK_REALTIME");
+ unless &Time::HiRes::d_clock_gettime && has_symbol("CLOCK_REALTIME");
my $ok = 0;
TRY: {
- for my $try (1..3) {
- print("# CLOCK_REALTIME: try = $try\n");
- my $t0 = Time::HiRes::clock_gettime(&CLOCK_REALTIME);
- my $T = 1.5;
- Time::HiRes::sleep($T);
- my $t1 = Time::HiRes::clock_gettime(&CLOCK_REALTIME);
- if ($t0 > 0 && $t1 > $t0) {
- print("# t1 = $t1, t0 = $t0\n");
- my $dt = $t1 - $t0;
- my $rt = abs(1 - $dt / $T);
- print("# dt = $dt, rt = $rt\n");
- if ($rt <= 2 * $limit) {
- $ok = 1;
- last TRY;
- }
- } else {
- print("# Error: t0 = $t0, t1 = $t1\n");
- }
- my $r = rand() + rand();
- printf("# Sleeping for %.6f seconds...\n", $r);
- Time::HiRes::sleep($r);
- }
+ for my $try (1..3) {
+ print("# CLOCK_REALTIME: try = $try\n");
+ my $t0 = Time::HiRes::clock_gettime(&CLOCK_REALTIME);
+ my $T = 1.5;
+ Time::HiRes::sleep($T);
+ my $t1 = Time::HiRes::clock_gettime(&CLOCK_REALTIME);
+ if ($t0 > 0 && $t1 > $t0) {
+ print("# t1 = $t1, t0 = $t0\n");
+ my $dt = $t1 - $t0;
+ my $rt = abs(1 - $dt / $T);
+ print("# dt = $dt, rt = $rt\n");
+ if ($rt <= 2 * $limit) {
+ $ok = 1;
+ last TRY;
+ }
+ } else {
+ print("# Error: t0 = $t0, t1 = $t1\n");
+ }
+ my $r = rand() + rand();
+ printf("# Sleeping for %.6f seconds...\n", $r);
+ Time::HiRes::sleep($r);
+ }
}
ok $ok;
}
@@ -70,7 +70,7 @@ SKIP: {
SKIP: {
skip "no clock_nanosleep", 1
- unless &Time::HiRes::d_clock_nanosleep && has_symbol("CLOCK_REALTIME");
+ unless &Time::HiRes::d_clock_nanosleep && has_symbol("CLOCK_REALTIME");
my $s = 1.5e9;
my $t = Time::HiRes::clock_nanosleep(&CLOCK_REALTIME, $s);
my $r = abs(1 - $t / $s);
@@ -79,7 +79,7 @@ SKIP: {
SKIP: {
skip "no clock", 1 unless &Time::HiRes::d_clock;
- skip "no CLOCKS_PER_SEC", 1 unless has_symbol("CLOCKS_PER_SEC");
+ skip "no CLOCKS_PER_SEC", 1 unless has_symbol("CLOCKS_PER_SEC");
my @clock = Time::HiRes::clock();
# If we have a relatively low precision clock() and we haven't seen much
# CPU usage thus far with clock(), we will want to have a bit longer delay.
@@ -89,13 +89,13 @@ SKIP: {
print("# clock = @clock\n");
for my $i (1..3) {
for (my $j = 0; $j < $delay; $j++) { }
- push @clock, Time::HiRes::clock();
- print("# clock = @clock\n");
+ push @clock, Time::HiRes::clock();
+ print("# clock = @clock\n");
}
ok $clock[0] >= 0 &&
- $clock[1] > $clock[0] &&
- $clock[2] > $clock[1] &&
- $clock[3] > $clock[2];
+ $clock[1] > $clock[0] &&
+ $clock[2] > $clock[1] &&
+ $clock[3] > $clock[2];
}
1;
diff --git a/t/gettimeofday.t b/t/gettimeofday.t
index 9f2fd7e..05cebbb 100644
--- a/t/gettimeofday.t
+++ b/t/gettimeofday.t
@@ -3,8 +3,8 @@ use strict;
BEGIN {
require Time::HiRes;
unless(&Time::HiRes::d_gettimeofday) {
- require Test::More;
- Test::More::plan(skip_all => "no gettimeofday()");
+ require Test::More;
+ Test::More::plan(skip_all => "no gettimeofday()");
}
}
@@ -21,7 +21,7 @@ sleep 1;
my @two = Time::HiRes::gettimeofday();
ok $two[0] > $one[0] || ($two[0] == $one[0] && $two[1] > $one[1])
- or print("# @two is not greater than @one\n");
+ or print("# @two is not greater than @one\n");
my $f = Time::HiRes::time();
ok $f > 850_000_000 or print("# $f too small\n");
diff --git a/t/itimer.t b/t/itimer.t
index 432b224..4e4ce6d 100644
--- a/t/itimer.t
+++ b/t/itimer.t
@@ -13,15 +13,15 @@ use Config;
BEGIN {
require Time::HiRes;
unless(defined &Time::HiRes::setitimer
- && defined &Time::HiRes::getitimer
- && has_symbol('ITIMER_VIRTUAL')
- && $Config{sig_name} =~ m/\bVTALRM\b/
- && $^O ne 'nto' # nto: QNX 6 has the API but no implementation
- && $^O ne 'haiku' # haiku: has the API but no implementation
- && $^O ne 'gnu' # GNU/Hurd: has the API but no implementation
+ && defined &Time::HiRes::getitimer
+ && has_symbol('ITIMER_VIRTUAL')
+ && $Config{sig_name} =~ m/\bVTALRM\b/
+ && $^O ne 'nto' # nto: QNX 6 has the API but no implementation
+ && $^O ne 'haiku' # haiku: has the API but no implementation
+ && $^O ne 'gnu' # GNU/Hurd: has the API but no implementation
) {
- require Test::More;
- Test::More::plan(skip_all => "no itimer");
+ require Test::More;
+ Test::More::plan(skip_all => "no itimer");
}
}
@@ -37,7 +37,7 @@ my $r = [Time::HiRes::gettimeofday()];
$SIG{VTALRM} = sub {
$i ? $i-- : Time::HiRes::setitimer(&Time::HiRes::ITIMER_VIRTUAL, 0);
printf("# Tick! $i %s\n", Time::HiRes::tv_interval($r));
-};
+};
printf("# setitimer: %s\n", join(" ",
Time::HiRes::setitimer(&Time::HiRes::ITIMER_VIRTUAL, 0.5, 0.4)));
diff --git a/t/nanosleep.t b/t/nanosleep.t
index 98cc8d9..ff05637 100644
--- a/t/nanosleep.t
+++ b/t/nanosleep.t
@@ -3,8 +3,8 @@ use strict;
BEGIN {
require Time::HiRes;
unless(&Time::HiRes::d_nanosleep) {
- require Test::More;
- Test::More::plan(skip_all => "no nanosleep()");
+ require Test::More;
+ Test::More::plan(skip_all => "no nanosleep()");
}
}
@@ -14,7 +14,7 @@ use t::Watchdog;
eval { Time::HiRes::nanosleep(-5) };
like $@, qr/::nanosleep\(-5\): negative time not invented yet/,
- "negative time error";
+ "negative time error";
my $one = CORE::time;
Time::HiRes::nanosleep(10_000_000);
diff --git a/t/sleep.t b/t/sleep.t
index 0ab6340..0451650 100644
--- a/t/sleep.t
+++ b/t/sleep.t
@@ -8,7 +8,7 @@ BEGIN { require_ok "Time::HiRes"; }
use Config;
-my $xdefine = '';
+my $xdefine = '';
if (open(XDEFINE, "<", "xdefine")) {
chomp($xdefine = <XDEFINE> || "");
close(XDEFINE);
@@ -22,11 +22,11 @@ my $can_subsecond_alarm =
eval { Time::HiRes::sleep(-1) };
like $@, qr/::sleep\(-1\): negative time not invented yet/,
- "negative time error";
+ "negative time error";
SKIP: {
skip "no subsecond alarm", 2 unless $can_subsecond_alarm;
- my $f = Time::HiRes::time;
+ my $f = Time::HiRes::time;
print("# time...$f\n");
ok 1;
diff --git a/t/stat.t b/t/stat.t
index d5e22ac..f2f8e87 100644
--- a/t/stat.t
+++ b/t/stat.t
@@ -3,13 +3,13 @@ use strict;
BEGIN {
require Time::HiRes;
unless(&Time::HiRes::d_hires_stat) {
- require Test::More;
- Test::More::plan(skip_all => "no hi-res stat");
+ require Test::More;
+ Test::More::plan(skip_all => "no hi-res stat");
}
if($^O =~ /\A(?:cygwin|MSWin)/) {
- require Test::More;
- Test::More::plan(skip_all =>
- "$^O file timestamps not reliable enough for stat test");
+ require Test::More;
+ Test::More::plan(skip_all =>
+ "$^O file timestamps not reliable enough for stat test");
}
}
@@ -50,18 +50,18 @@ my $mi = 0;
my $ss = 0;
for (my $i = 1; $i < @atime; $i++) {
if ($atime[$i] >= $atime[$i-1]) {
- $ai++;
+ $ai++;
}
if ($atime[$i] > int($atime[$i])) {
- $ss++;
+ $ss++;
}
}
for (my $i = 1; $i < @mtime; $i++) {
if ($mtime[$i] >= $mtime[$i-1]) {
- $mi++;
+ $mi++;
}
if ($mtime[$i] > int($mtime[$i])) {
- $ss++;
+ $ss++;
}
}
print("# ai = $ai, mi = $mi, ss = $ss\n");
@@ -70,7 +70,7 @@ print("# ai = $ai, mi = $mi, ss = $ss\n");
SKIP: {
skip "no subsecond timestamps detected", 1 if $ss == 0;
ok $mi/(@mtime-1) >= 0.75 && $ai/(@atime-1) >= 0.75 &&
- $ss/(@mtime+@atime) >= 0.2;
+ $ss/(@mtime+@atime) >= 0.2;
}
my $targetname = "tgt$$";
diff --git a/t/time.t b/t/time.t
index 5db016f..ad42f47 100644
--- a/t/time.t
+++ b/t/time.t
@@ -10,14 +10,14 @@ SKIP: {
skip "no gettimeofday", 1 unless &Time::HiRes::d_gettimeofday;
my ($s, $n, $i) = (0);
for $i (1 .. 100) {
- $s += Time::HiRes::time() - CORE::time();
- $n++;
+ $s += Time::HiRes::time() - CORE::time();
+ $n++;
}
# $s should be, at worst, equal to $n
# (CORE::time() may be rounding down, up, or closest),
# but allow 10% of slop.
ok abs($s) / $n <= 1.10
- or print("# Time::HiRes::time() not close to CORE::time()\n");
+ or print("# Time::HiRes::time() not close to CORE::time()\n");
printf("# s = $s, n = $n, s/n = %s\n", abs($s)/$n);
}
diff --git a/t/ualarm.t b/t/ualarm.t
index 0f9a829..d478224 100644
--- a/t/ualarm.t
+++ b/t/ualarm.t
@@ -3,8 +3,8 @@ use strict;
BEGIN {
require Time::HiRes;
unless(&Time::HiRes::d_ualarm) {
- require Test::More;
- Test::More::plan(skip_all => "no ualarm()");
+ require Test::More;
+ Test::More::plan(skip_all => "no ualarm()");
}
}
@@ -25,7 +25,7 @@ SKIP: {
$tick = 0; Time::HiRes::ualarm(10_000); while ($tick == 0) { }
my $three = CORE::time;
ok $one == $two || $two == $three
- or print("# slept too long, $one $two $three\n");
+ or print("# slept too long, $one $two $three\n");
print("# tick = $tick, one = $one, two = $two, three = $three\n");
$tick = 0; Time::HiRes::ualarm(10_000, 10_000); while ($tick < 3) { }
@@ -36,7 +36,7 @@ SKIP: {
eval { Time::HiRes::ualarm(-4) };
like $@, qr/::ualarm\(-4, 0\): negative time not invented yet/,
- "negative time error";
+ "negative time error";
# Find the loop size N (a for() loop 0..N-1)
# that will take more than T seconds.
@@ -44,9 +44,9 @@ like $@, qr/::ualarm\(-4, 0\): negative time not invented yet/,
sub bellish { # Cheap emulation of a bell curve.
my ($min, $max) = @_;
my $rand = ($max - $min) / 5;
- my $sum = 0;
+ my $sum = 0;
for my $i (0..4) {
- $sum += rand($rand);
+ $sum += rand($rand);
}
return $min + $sum;
}
@@ -57,25 +57,25 @@ sub bellish { # Cheap emulation of a bell curve.
for my $n (100_000, 1_100_000, 2_200_000, 4_300_000) {
my $ok;
for my $retry (1..10) {
- my $alarmed = 0;
- local $SIG{ ALRM } = sub { $alarmed++ };
- my $t0 = Time::HiRes::time();
- print("# t0 = $t0\n");
- print("# ualarm($n)\n");
- Time::HiRes::ualarm($n); 1 while $alarmed == 0;
- my $t1 = Time::HiRes::time();
- print("# t1 = $t1\n");
- my $dt = $t1 - $t0;
- print("# dt = $dt\n");
- my $r = $dt / ($n/1e6);
- print("# r = $r\n");
- $ok =
- ($n < 1_000_000 || # Too much noise.
- ($r >= 0.8 && $r <= 1.6));
- last if $ok;
- my $nap = bellish(3, 15);
- printf("# Retrying in %.1f seconds...\n", $nap);
- Time::HiRes::sleep($nap);
+ my $alarmed = 0;
+ local $SIG{ ALRM } = sub { $alarmed++ };
+ my $t0 = Time::HiRes::time();
+ print("# t0 = $t0\n");
+ print("# ualarm($n)\n");
+ Time::HiRes::ualarm($n); 1 while $alarmed == 0;
+ my $t1 = Time::HiRes::time();
+ print("# t1 = $t1\n");
+ my $dt = $t1 - $t0;
+ print("# dt = $dt\n");
+ my $r = $dt / ($n/1e6);
+ print("# r = $r\n");
+ $ok =
+ ($n < 1_000_000 || # Too much noise.
+ ($r >= 0.8 && $r <= 1.6));
+ last if $ok;
+ my $nap = bellish(3, 15);
+ printf("# Retrying in %.1f seconds...\n", $nap);
+ Time::HiRes::sleep($nap);
}
ok $ok or print("# ualarm($n) close enough\n");
}
@@ -89,8 +89,8 @@ for my $n (100_000, 1_100_000, 2_200_000, 4_300_000) {
my($alrm, $t1);
do {
- $alrm = $alrm0;
- $t1 = Time::HiRes::time();
+ $alrm = $alrm0;
+ $t1 = Time::HiRes::time();
} while $t1 - $t0 <= 0.3;
my $got1 = Time::HiRes::ualarm(0);
@@ -101,9 +101,9 @@ for my $n (100_000, 1_100_000, 2_200_000, 4_300_000) {
print("# got1 = $got1\n");
ok $got0 == 0 or print("# $got0\n");
SKIP: {
- skip "alarm interval exceeded", 2 if $t1 - $t0 >= 0.5;
- ok $got1 > 0;
- ok $alrm == 0;
+ skip "alarm interval exceeded", 2 if $t1 - $t0 >= 0.5;
+ ok $got1 > 0;
+ ok $alrm == 0;
}
ok $got1 < 300_000;
my $got2 = Time::HiRes::ualarm(0);
diff --git a/t/usleep.t b/t/usleep.t
index bb66cbe..396341d 100644
--- a/t/usleep.t
+++ b/t/usleep.t
@@ -3,8 +3,8 @@ use strict;
BEGIN {
require Time::HiRes;
unless(&Time::HiRes::d_usleep) {
- require Test::More;
- Test::More::plan(skip_all => "no usleep()");
+ require Test::More;
+ Test::More::plan(skip_all => "no usleep()");
}
}
@@ -14,7 +14,7 @@ use t::Watchdog;
eval { Time::HiRes::usleep(-2) };
like $@, qr/::usleep\(-2\): negative time not invented yet/,
- "negative time error";
+ "negative time error";
my $limit = 0.25; # 25% is acceptable slosh for testing timers
@@ -59,8 +59,8 @@ SKIP: {
$msg = "$td went by while sleeping $sleep, ratio $ratio.\n";
SKIP: {
- skip $msg, 1 unless $td < $sleep * (1 + $limit);
- ok $a < $limit or print("# $msg\n");
+ skip $msg, 1 unless $td < $sleep * (1 + $limit);
+ ok $a < $limit or print("# $msg\n");
}
$t0 = Time::HiRes::gettimeofday();
@@ -71,8 +71,8 @@ SKIP: {
$msg = "$td went by while sleeping $sleep, ratio $ratio.\n";
SKIP: {
- skip $msg, 1 unless $td < $sleep * (1 + $limit);
- ok $a < $limit or print("# $msg\n");
+ skip $msg, 1 unless $td < $sleep * (1 + $limit);
+ ok $a < $limit or print("# $msg\n");
}
}
diff --git a/t/utime.t b/t/utime.t
index bb4621a..e2399b8 100644
--- a/t/utime.t
+++ b/t/utime.t
@@ -1,92 +1,92 @@
use strict;
sub has_subsecond_file_times {
- require File::Temp;
- require Time::HiRes;
- my ($fh, $filename) = File::Temp::tempfile( "Time-HiRes-utime-XXXXXXXXX" );
- use File::Basename qw[dirname];
- my $dirname = dirname($filename);
- require Cwd;
- $dirname = &Cwd::getcwd if $dirname eq '.';
- print("\n# Testing for subsecond file timestamps (mtime) in $dirname\n");
- close $fh;
- my @mtimes;
- for (1..2) {
- open $fh, '>', $filename;
- print $fh "foo";
+ require File::Temp;
+ require Time::HiRes;
+ my ($fh, $filename) = File::Temp::tempfile( "Time-HiRes-utime-XXXXXXXXX" );
+ use File::Basename qw[dirname];
+ my $dirname = dirname($filename);
+ require Cwd;
+ $dirname = &Cwd::getcwd if $dirname eq '.';
+ print("\n# Testing for subsecond file timestamps (mtime) in $dirname\n");
close $fh;
- push @mtimes, (Time::HiRes::stat($filename))[9];
- Time::HiRes::sleep(.1) if $_ == 1;
- }
- my $delta = $mtimes[1] - $mtimes[0];
- # print STDERR "mtimes = @mtimes, delta = $delta\n";
- unlink $filename;
- my $ok = $delta > 0 && $delta < 1;
- printf("# Subsecond file timestamps in $dirname: %s\n",
- $ok ? "OK" : "NO");
- return $ok;
+ my @mtimes;
+ for (1..2) {
+ open $fh, '>', $filename;
+ print $fh "foo";
+ close $fh;
+ push @mtimes, (Time::HiRes::stat($filename))[9];
+ Time::HiRes::sleep(.1) if $_ == 1;
+ }
+ my $delta = $mtimes[1] - $mtimes[0];
+ # print STDERR "mtimes = @mtimes, delta = $delta\n";
+ unlink $filename;
+ my $ok = $delta > 0 && $delta < 1;
+ printf("# Subsecond file timestamps in $dirname: %s\n",
+ $ok ? "OK" : "NO");
+ return $ok;
}
sub get_filesys_of_tempfile {
- require File::Temp;
- require Time::HiRes;
- my ($fh, $filename) = File::Temp::tempfile( "Time-HiRes-utime-XXXXXXXXX" );
- my $filesys;
- if (open(my $df, "df $filename |")) {
- my @fs;
- while (<$df>) {
- next if /^Filesystem/;
- chomp;
- push @fs, $_;
- }
- if (@fs == 1) {
- if (defined $fs[0] && length($fs[0])) {
- $filesys = $fs[0];
- } else {
- printf("# Got empty result from 'df'\n");
- }
+ require File::Temp;
+ require Time::HiRes;
+ my ($fh, $filename) = File::Temp::tempfile( "Time-HiRes-utime-XXXXXXXXX" );
+ my $filesys;
+ if (open(my $df, "df $filename |")) {
+ my @fs;
+ while (<$df>) {
+ next if /^Filesystem/;
+ chomp;
+ push @fs, $_;
+ }
+ if (@fs == 1) {
+ if (defined $fs[0] && length($fs[0])) {
+ $filesys = $fs[0];
+ } else {
+ printf("# Got empty result from 'df'\n");
+ }
+ } else {
+ printf("# Expected one result from 'df', got %d\n", scalar(@fs));
+ }
} else {
- printf("# Expected one result from 'df', got %d\n", scalar(@fs));
+ # Too noisy to show by default.
+ # Can fail for too many reasons.
+ print "# Failed to run 'df $filename |': $!\n";
}
- } else {
- # Too noisy to show by default.
- # Can fail for too many reasons.
- print "# Failed to run 'df $filename |': $!\n";
- }
- return $filesys;
+ return $filesys;
}
sub get_mount_of_filesys {
- my ($filesys) = @_;
- # netbsd has /sbin/mount
- local $ENV{PATH} = "$ENV{PATH}:/sbin" if $^O =~ /^(?:netbsd)$/;
- if (defined $filesys) {
- my @fs = split(' ', $filesys);
- if (open(my $mount, "mount |")) {
- while (<$mount>) {
- chomp;
- my @mnt = split(' ');
- if ($mnt[0] eq $fs[0]) {
- return $_;
+ my ($filesys) = @_;
+ # netbsd has /sbin/mount
+ local $ENV{PATH} = "$ENV{PATH}:/sbin" if $^O =~ /^(?:netbsd)$/;
+ if (defined $filesys) {
+ my @fs = split(' ', $filesys);
+ if (open(my $mount, "mount |")) {
+ while (<$mount>) {
+ chomp;
+ my @mnt = split(' ');
+ if ($mnt[0] eq $fs[0]) {
+ return $_;
+ }
+ }
+ } else {
+ # Too noisy to show by default.
+ # The mount(8) might not be in the PATH, for example.
+ # Or this might be a completely non-UNIX system.
+ # print "# Failed to run 'mount |': $!\n";
}
- }
- } else {
- # Too noisy to show by default.
- # The mount(8) might not be in the PATH, for example.
- # Or this might be a completely non-UNIX system.
- # print "# Failed to run 'mount |': $!\n";
}
- }
- return;
+ return;
}
sub get_mount_of_tempfile {
- return get_mount_of_filesys(get_filesys_of_tempfile());
+ return get_mount_of_filesys(get_filesys_of_tempfile());
}
sub tempfile_has_noatime_mount {
- my ($mount) = get_mount_of_tempfile();
- return $mount =~ /\bnoatime\b/;
+ my ($mount) = get_mount_of_tempfile();
+ return $mount =~ /\bnoatime\b/;
}
BEGIN {
@@ -94,21 +94,21 @@ BEGIN {
require Test::More;
require File::Temp;
unless(&Time::HiRes::d_hires_utime) {
- Test::More::plan(skip_all => "no hires_utime");
+ Test::More::plan(skip_all => "no hires_utime");
}
unless(&Time::HiRes::d_hires_stat) {
# Being able to read subsecond timestamps is a reasonable
- # prerequisite for being able to write them.
- Test::More::plan(skip_all => "no hires_stat");
+ # prerequisite for being able to write them.
+ Test::More::plan(skip_all => "no hires_stat");
}
unless (&Time::HiRes::d_futimens) {
- Test::More::plan(skip_all => "no futimens()");
+ Test::More::plan(skip_all => "no futimens()");
}
unless (&Time::HiRes::d_utimensat) {
- Test::More::plan(skip_all => "no utimensat()");
+ Test::More::plan(skip_all => "no utimensat()");
}
unless (has_subsecond_file_times()) {
- Test::More::plan(skip_all => "No subsecond file timestamps");
+ Test::More::plan(skip_all => "No subsecond file timestamps");
}
}
@@ -128,117 +128,117 @@ my $atime = 1.111111111;
my $mtime = 2.222222222;
if ($^O eq 'cygwin') {
- # Cygwin timestamps have less precision.
- $atime = 1.1111111;
- $mtime = 2.2222222;
+ # Cygwin timestamps have less precision.
+ $atime = 1.1111111;
+ $mtime = 2.2222222;
}
print "# \$^O = $^O, atime = $atime, mtime = $mtime\n";
my $skip_atime = $^O eq 'netbsd' && tempfile_has_noatime_mount();
if ($skip_atime) {
- printf("# Skipping atime tests because tempfiles seem to be in a filesystem mounted with 'noatime' ($^O)\n'");
+ printf("# Skipping atime tests because tempfiles seem to be in a filesystem mounted with 'noatime' ($^O)\n'");
}
print "# utime \$fh\n";
{
- my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
- is Time::HiRes::utime($atime, $mtime, $fh), 1, "One file changed";
- my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename) )[8, 9];
- SKIP: {
- skip("noatime mount", 1) if $skip_atime;
- is $got_atime, $atime, "atime set correctly";
- }
- is $got_mtime, $mtime, "mtime set correctly";
+ my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
+ is Time::HiRes::utime($atime, $mtime, $fh), 1, "One file changed";
+ my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename) )[8, 9];
+ SKIP: {
+ skip("noatime mount", 1) if $skip_atime;
+ is $got_atime, $atime, "atime set correctly";
+ }
+ is $got_mtime, $mtime, "mtime set correctly";
};
print "#utime \$filename\n";
{
- my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
- is Time::HiRes::utime($atime, $mtime, $filename), 1, "One file changed";
- my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh) )[8, 9];
- SKIP: {
- skip("noatime mount", 1) if $skip_atime;
- is $got_atime, $atime, "atime set correctly";
- }
- is $got_mtime, $mtime, "mtime set correctly";
+ my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
+ is Time::HiRes::utime($atime, $mtime, $filename), 1, "One file changed";
+ my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh) )[8, 9];
+ SKIP: {
+ skip("noatime mount", 1) if $skip_atime;
+ is $got_atime, $atime, "atime set correctly";
+ }
+ is $got_mtime, $mtime, "mtime set correctly";
};
print "#utime \$filename round-trip\n";
{
- my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
- # this fractional part is not exactly representable
- my $t = 1000000000.12345;
- is Time::HiRes::utime($t, $t, $filename), 1, "One file changed";
- my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh) )[8, 9];
- is Time::HiRes::utime($got_atime, $got_mtime, $filename), 1, "One file changed";
- my ($got_atime2, $got_mtime2) = ( Time::HiRes::stat($fh) )[8, 9];
- is $got_atime, $got_atime2, "atime round trip ok";
- is $got_mtime, $got_mtime2, "mtime round trip ok";
+ my ($fh, $filename) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
+ # this fractional part is not exactly representable
+ my $t = 1000000000.12345;
+ is Time::HiRes::utime($t, $t, $filename), 1, "One file changed";
+ my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh) )[8, 9];
+ is Time::HiRes::utime($got_atime, $got_mtime, $filename), 1, "One file changed";
+ my ($got_atime2, $got_mtime2) = ( Time::HiRes::stat($fh) )[8, 9];
+ is $got_atime, $got_atime2, "atime round trip ok";
+ is $got_mtime, $got_mtime2, "mtime round trip ok";
};
print "utime \$filename and \$fh\n";
{
- my ($fh1, $filename1) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
- my ($fh2, $filename2) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
- is Time::HiRes::utime($atime, $mtime, $filename1, $fh2), 2, "Two files changed";
- {
- my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh1) )[8, 9];
- SKIP: {
- skip("noatime mount", 1) if $skip_atime;
- is $got_atime, $atime, "File 1 atime set correctly";
- }
- is $got_mtime, $mtime, "File 1 mtime set correctly";
- }
- {
- my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename2) )[8, 9];
- SKIP: {
- skip("noatime mount", 1) if $skip_atime;
- is $got_atime, $atime, "File 2 atime set correctly";
- }
- is $got_mtime, $mtime, "File 2 mtime set correctly";
- }
+ my ($fh1, $filename1) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
+ my ($fh2, $filename2) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
+ is Time::HiRes::utime($atime, $mtime, $filename1, $fh2), 2, "Two files changed";
+ {
+ my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh1) )[8, 9];
+ SKIP: {
+ skip("noatime mount", 1) if $skip_atime;
+ is $got_atime, $atime, "File 1 atime set correctly";
+ }
+ is $got_mtime, $mtime, "File 1 mtime set correctly";
+ }
+ {
+ my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename2) )[8, 9];
+ SKIP: {
+ skip("noatime mount", 1) if $skip_atime;
+ is $got_atime, $atime, "File 2 atime set correctly";
+ }
+ is $got_mtime, $mtime, "File 2 mtime set correctly";
+ }
};
print "# utime undef sets time to now\n";
{
- my ($fh1, $filename1) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
- my ($fh2, $filename2) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
-
- my $now = Time::HiRes::time;
- sleep(1);
- is Time::HiRes::utime(undef, undef, $filename1, $fh2), 2, "Two files changed";
-
- {
- my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh1) )[8, 9];
- SKIP: {
- skip("noatime mount", 1) if $skip_atime;
- cmp_ok $got_atime, '>=', $now, "File 1 atime set correctly";
- }
- cmp_ok $got_mtime, '>=', $now, "File 1 mtime set correctly";
- }
- {
- my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename2) )[8, 9];
- SKIP: {
- skip("noatime mount", 1) if $skip_atime;
- cmp_ok $got_atime, '>=', $now, "File 2 atime set correctly";
- }
- cmp_ok $got_mtime, '>=', $now, "File 2 mtime set correctly";
- }
+ my ($fh1, $filename1) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
+ my ($fh2, $filename2) = tempfile( "Time-HiRes-utime-XXXXXXXXX", UNLINK => 1 );
+
+ my $now = Time::HiRes::time;
+ sleep(1);
+ is Time::HiRes::utime(undef, undef, $filename1, $fh2), 2, "Two files changed";
+
+ {
+ my ($got_atime, $got_mtime) = ( Time::HiRes::stat($fh1) )[8, 9];
+ SKIP: {
+ skip("noatime mount", 1) if $skip_atime;
+ cmp_ok $got_atime, '>=', $now, "File 1 atime set correctly";
+ }
+ cmp_ok $got_mtime, '>=', $now, "File 1 mtime set correctly";
+ }
+ {
+ my ($got_atime, $got_mtime) = ( Time::HiRes::stat($filename2) )[8, 9];
+ SKIP: {
+ skip("noatime mount", 1) if $skip_atime;
+ cmp_ok $got_atime, '>=', $now, "File 2 atime set correctly";
+ }
+ cmp_ok $got_mtime, '>=', $now, "File 2 mtime set correctly";
+ }
};
print "# negative atime dies\n";
{
- eval { Time::HiRes::utime(-4, $mtime) };
- like $@, qr/::utime\(-4, 2\.22222\): negative time not invented yet/,
- "negative time error";
+ eval { Time::HiRes::utime(-4, $mtime) };
+ like $@, qr/::utime\(-4, 2\.22222\): negative time not invented yet/,
+ "negative time error";
};
print "# negative mtime dies;\n";
{
- eval { Time::HiRes::utime($atime, -4) };
- like $@, qr/::utime\(1.11111, -4\): negative time not invented yet/,
- "negative time error";
+ eval { Time::HiRes::utime($atime, -4) };
+ like $@, qr/::utime\(1.11111, -4\): negative time not invented yet/,
+ "negative time error";
};
done_testing();
diff --git a/typemap b/typemap
index ffe60e3..2772c92 100644
--- a/typemap
+++ b/typemap
@@ -1,319 +1,319 @@
# basic C types
-int T_IV
-unsigned T_UV
-unsigned int T_UV
-long T_IV
-unsigned long T_UV
-short T_IV
-unsigned short T_UV
-char T_CHAR
-unsigned char T_U_CHAR
-char * T_PV
-unsigned char * T_PV
-const char * T_PV
-caddr_t T_PV
-wchar_t * T_PV
-wchar_t T_IV
-bool_t T_IV
-size_t T_UV
-ssize_t T_IV
-time_t T_NV
-unsigned long * T_OPAQUEPTR
-char ** T_PACKEDARRAY
-void * T_PTR
-Time_t * T_PV
-SV * T_SV
-SVREF T_SVREF
-AV * T_AVREF
-HV * T_HVREF
-CV * T_CVREF
+int T_IV
+unsigned T_UV
+unsigned int T_UV
+long T_IV
+unsigned long T_UV
+short T_IV
+unsigned short T_UV
+char T_CHAR
+unsigned char T_U_CHAR
+char * T_PV
+unsigned char * T_PV
+const char * T_PV
+caddr_t T_PV
+wchar_t * T_PV
+wchar_t T_IV
+bool_t T_IV
+size_t T_UV
+ssize_t T_IV
+time_t T_NV
+unsigned long * T_OPAQUEPTR
+char ** T_PACKEDARRAY
+void * T_PTR
+Time_t * T_PV
+SV * T_SV
+SVREF T_SVREF
+AV * T_AVREF
+HV * T_HVREF
+CV * T_CVREF
clockid_t T_IV
-IV T_IV
-UV T_UV
+IV T_IV
+UV T_UV
NV T_NV
-I32 T_IV
-I16 T_IV
-I8 T_IV
-STRLEN T_UV
-U32 T_U_LONG
-U16 T_U_SHORT
-U8 T_UV
-Result T_U_CHAR
-Boolean T_BOOL
+I32 T_IV
+I16 T_IV
+I8 T_IV
+STRLEN T_UV
+U32 T_U_LONG
+U16 T_U_SHORT
+U8 T_UV
+Result T_U_CHAR
+Boolean T_BOOL
float T_FLOAT
-double T_DOUBLE
-SysRet T_SYSRET
-SysRetLong T_SYSRET
-FILE * T_STDIO
-PerlIO * T_INOUT
-FileHandle T_PTROBJ
-InputStream T_IN
-InOutStream T_INOUT
-OutputStream T_OUT
-bool T_BOOL
+double T_DOUBLE
+SysRet T_SYSRET
+SysRetLong T_SYSRET
+FILE * T_STDIO
+PerlIO * T_INOUT
+FileHandle T_PTROBJ
+InputStream T_IN
+InOutStream T_INOUT
+OutputStream T_OUT
+bool T_BOOL
#############################################################################
INPUT
T_SV
- $var = $arg
+ $var = $arg
T_SVREF
- if (SvROK($arg))
- $var = (SV*)SvRV($arg);
- else
- Perl_croak(aTHX_ \"$var is not a reference\")
+ if (SvROK($arg))
+ $var = (SV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"$var is not a reference\")
T_AVREF
- if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
- $var = (AV*)SvRV($arg);
- else
- Perl_croak(aTHX_ \"$var is not an array reference\")
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
+ $var = (AV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"$var is not an array reference\")
T_HVREF
- if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
- $var = (HV*)SvRV($arg);
- else
- Perl_croak(aTHX_ \"$var is not a hash reference\")
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
+ $var = (HV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"$var is not a hash reference\")
T_CVREF
- if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV)
- $var = (CV*)SvRV($arg);
- else
- Perl_croak(aTHX_ \"$var is not a code reference\")
+ if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV)
+ $var = (CV*)SvRV($arg);
+ else
+ Perl_croak(aTHX_ \"$var is not a code reference\")
T_SYSRET
- $var NOT IMPLEMENTED
+ $var NOT IMPLEMENTED
T_UV
- $var = ($type)SvUV($arg)
+ $var = ($type)SvUV($arg)
T_IV
- $var = ($type)SvIV($arg)
+ $var = ($type)SvIV($arg)
T_INT
- $var = (int)SvIV($arg)
+ $var = (int)SvIV($arg)
T_ENUM
- $var = ($type)SvIV($arg)
+ $var = ($type)SvIV($arg)
T_BOOL
- $var = (bool)SvTRUE($arg)
+ $var = (bool)SvTRUE($arg)
T_U_INT
- $var = (unsigned int)SvUV($arg)
+ $var = (unsigned int)SvUV($arg)
T_SHORT
- $var = (short)SvIV($arg)
+ $var = (short)SvIV($arg)
T_U_SHORT
- $var = (unsigned short)SvUV($arg)
+ $var = (unsigned short)SvUV($arg)
T_LONG
- $var = (long)SvIV($arg)
+ $var = (long)SvIV($arg)
T_U_LONG
- $var = (unsigned long)SvUV($arg)
+ $var = (unsigned long)SvUV($arg)
T_CHAR
- $var = (char)*SvPV_nolen($arg)
+ $var = (char)*SvPV_nolen($arg)
T_U_CHAR
- $var = (unsigned char)SvUV($arg)
+ $var = (unsigned char)SvUV($arg)
T_FLOAT
- $var = (float)SvNV($arg)
+ $var = (float)SvNV($arg)
T_NV
- $var = ($type)SvNV($arg)
+ $var = ($type)SvNV($arg)
T_DOUBLE
- $var = (double)SvNV($arg)
+ $var = (double)SvNV($arg)
T_PV
- $var = ($type)SvPV_nolen($arg)
+ $var = ($type)SvPV_nolen($arg)
T_PTR
- $var = INT2PTR($type,SvIV($arg))
+ $var = INT2PTR($type,SvIV($arg))
T_PTRREF
- if (SvROK($arg)) {
- IV tmp = SvIV((SV*)SvRV($arg));
- $var = INT2PTR($type,tmp);
- }
- else
- Perl_croak(aTHX_ \"$var is not a reference\")
+ if (SvROK($arg)) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not a reference\")
T_REF_IV_REF
- if (sv_isa($arg, \"${ntype}\")) {
- IV tmp = SvIV((SV*)SvRV($arg));
- $var = *INT2PTR($type *, tmp);
- }
- else
- Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = *INT2PTR($type *, tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
T_REF_IV_PTR
- if (sv_isa($arg, \"${ntype}\")) {
- IV tmp = SvIV((SV*)SvRV($arg));
- $var = INT2PTR($type, tmp);
- }
- else
- Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type, tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
T_PTROBJ
- if (sv_derived_from($arg, \"${ntype}\")) {
- IV tmp = SvIV((SV*)SvRV($arg));
- $var = INT2PTR($type,tmp);
- }
- else
- Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+ if (sv_derived_from($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
T_PTRDESC
- if (sv_isa($arg, \"${ntype}\")) {
- IV tmp = SvIV((SV*)SvRV($arg));
- ${type}_desc = (\U${type}_DESC\E*) tmp;
- $var = ${type}_desc->ptr;
- }
- else
- Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ ${type}_desc = (\U${type}_DESC\E*) tmp;
+ $var = ${type}_desc->ptr;
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
T_REFREF
- if (SvROK($arg)) {
- IV tmp = SvIV((SV*)SvRV($arg));
- $var = *INT2PTR($type,tmp);
- }
- else
- Perl_croak(aTHX_ \"$var is not a reference\")
+ if (SvROK($arg)) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = *INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not a reference\")
T_REFOBJ
- if (sv_isa($arg, \"${ntype}\")) {
- IV tmp = SvIV((SV*)SvRV($arg));
- $var = *INT2PTR($type,tmp);
- }
- else
- Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
+ if (sv_isa($arg, \"${ntype}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = *INT2PTR($type,tmp);
+ }
+ else
+ Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
T_OPAQUE
- $var = *($type *)SvPV_nolen($arg)
+ $var = *($type *)SvPV_nolen($arg)
T_OPAQUEPTR
- $var = ($type)SvPV_nolen($arg)
+ $var = ($type)SvPV_nolen($arg)
T_PACKED
- $var = XS_unpack_$ntype($arg)
+ $var = XS_unpack_$ntype($arg)
T_PACKEDARRAY
- $var = XS_unpack_$ntype($arg)
+ $var = XS_unpack_$ntype($arg)
T_CALLBACK
- $var = make_perl_cb_$type($arg)
+ $var = make_perl_cb_$type($arg)
T_ARRAY
- U32 ix_$var = $argoff;
- $var = $ntype(items -= $argoff);
- while (items--) {
- DO_ARRAY_ELEM;
- ix_$var++;
- }
- /* this is the number of elements in the array */
- ix_$var -= $argoff
+ U32 ix_$var = $argoff;
+ $var = $ntype(items -= $argoff);
+ while (items--) {
+ DO_ARRAY_ELEM;
+ ix_$var++;
+ }
+ /* this is the number of elements in the array */
+ ix_$var -= $argoff
T_STDIO
- $var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
+ $var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
T_IN
- $var = IoIFP(sv_2io($arg))
+ $var = IoIFP(sv_2io($arg))
T_INOUT
- $var = IoIFP(sv_2io($arg))
+ $var = IoIFP(sv_2io($arg))
T_OUT
- $var = IoOFP(sv_2io($arg))
+ $var = IoOFP(sv_2io($arg))
#############################################################################
OUTPUT
T_SV
- $arg = $var;
+ $arg = $var;
T_SVREF
- $arg = newRV((SV*)$var);
+ $arg = newRV((SV*)$var);
T_AVREF
- $arg = newRV((SV*)$var);
+ $arg = newRV((SV*)$var);
T_HVREF
- $arg = newRV((SV*)$var);
+ $arg = newRV((SV*)$var);
T_CVREF
- $arg = newRV((SV*)$var);
+ $arg = newRV((SV*)$var);
T_IV
- sv_setiv($arg, (IV)$var);
+ sv_setiv($arg, (IV)$var);
T_UV
- sv_setuv($arg, (UV)$var);
+ sv_setuv($arg, (UV)$var);
T_INT
- sv_setiv($arg, (IV)$var);
+ sv_setiv($arg, (IV)$var);
T_SYSRET
- if ($var != -1) {
- if ($var == 0)
- sv_setpvn($arg, "0 but true", 10);
- else
- sv_setiv($arg, (IV)$var);
- }
+ if ($var != -1) {
+ if ($var == 0)
+ sv_setpvn($arg, "0 but true", 10);
+ else
+ sv_setiv($arg, (IV)$var);
+ }
T_ENUM
- sv_setiv($arg, (IV)$var);
+ sv_setiv($arg, (IV)$var);
T_BOOL
- $arg = boolSV($var);
+ $arg = boolSV($var);
T_U_INT
- sv_setuv($arg, (UV)$var);
+ sv_setuv($arg, (UV)$var);
T_SHORT
- sv_setiv($arg, (IV)$var);
+ sv_setiv($arg, (IV)$var);
T_U_SHORT
- sv_setuv($arg, (UV)$var);
+ sv_setuv($arg, (UV)$var);
T_LONG
- sv_setiv($arg, (IV)$var);
+ sv_setiv($arg, (IV)$var);
T_U_LONG
- sv_setuv($arg, (UV)$var);
+ sv_setuv($arg, (UV)$var);
T_CHAR
- sv_setpvn($arg, (char *)&$var, 1);
+ sv_setpvn($arg, (char *)&$var, 1);
T_U_CHAR
- sv_setuv($arg, (UV)$var);
+ sv_setuv($arg, (UV)$var);
T_FLOAT
- sv_setnv($arg, (double)$var);
+ sv_setnv($arg, (double)$var);
T_NV
- sv_setnv($arg, (NV)$var);
+ sv_setnv($arg, (NV)$var);
T_DOUBLE
- sv_setnv($arg, (double)$var);
+ sv_setnv($arg, (double)$var);
T_PV
- sv_setpv((SV*)$arg, $var);
+ sv_setpv((SV*)$arg, $var);
T_PTR
- sv_setiv($arg, PTR2IV($var));
+ sv_setiv($arg, PTR2IV($var));
T_PTRREF
- sv_setref_pv($arg, Nullch, (void*)$var);
+ sv_setref_pv($arg, Nullch, (void*)$var);
T_REF_IV_REF
- sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
+ sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
T_REF_IV_PTR
- sv_setref_pv($arg, \"${ntype}\", (void*)$var);
+ sv_setref_pv($arg, \"${ntype}\", (void*)$var);
T_PTROBJ
- sv_setref_pv($arg, \"${ntype}\", (void*)$var);
+ sv_setref_pv($arg, \"${ntype}\", (void*)$var);
T_PTRDESC
- sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
+ sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
T_REFREF
- NOT_IMPLEMENTED
+ NOT_IMPLEMENTED
T_REFOBJ
- NOT IMPLEMENTED
+ NOT IMPLEMENTED
T_OPAQUE
- sv_setpvn($arg, (char *)&$var, sizeof($var));
+ sv_setpvn($arg, (char *)&$var, sizeof($var));
T_OPAQUEPTR
- sv_setpvn($arg, (char *)$var, sizeof(*$var));
+ sv_setpvn($arg, (char *)$var, sizeof(*$var));
T_PACKED
- XS_pack_$ntype($arg, $var);
+ XS_pack_$ntype($arg, $var);
T_PACKEDARRAY
- XS_pack_$ntype($arg, $var, count_$ntype);
-T_DATAUNIT
- sv_setpvn($arg, $var.chp(), $var.size());
+ XS_pack_$ntype($arg, $var, count_$ntype);
+T_DATAUNIT
+ sv_setpvn($arg, $var.chp(), $var.size());
T_CALLBACK
- sv_setpvn($arg, $var.context.value().chp(),
- $var.context.value().size());
+ sv_setpvn($arg, $var.context.value().chp(),
+ $var.context.value().size());
T_ARRAY
- {
- U32 ix_$var;
- EXTEND(SP,size_$var);
- for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
- ST(ix_$var) = sv_newmortal();
- DO_ARRAY_ELEM
- }
+ {
+ U32 ix_$var;
+ EXTEND(SP,size_$var);
+ for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
+ ST(ix_$var) = sv_newmortal();
+ DO_ARRAY_ELEM
}
+ }
T_STDIO
- {
- GV *gv = (GV *)sv_newmortal();
- PerlIO *fp = PerlIO_importFILE($var,0);
- gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
- if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
- sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
- else
- $arg = &PL_sv_undef;
- }
+ {
+ GV *gv = (GV *)sv_newmortal();
+ PerlIO *fp = PerlIO_importFILE($var,0);
+ gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
+ if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
T_IN
- {
- GV *gv = (GV *)sv_newmortal();
- gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
- if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
- sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
- else
- $arg = &PL_sv_undef;
- }
+ {
+ GV *gv = (GV *)sv_newmortal();
+ gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
+ if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
T_INOUT
- {
- GV *gv = (GV *)sv_newmortal();
- gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
- if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
- sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
- else
- $arg = &PL_sv_undef;
- }
+ {
+ GV *gv = (GV *)sv_newmortal();
+ gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
+ if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
T_OUT
- {
- GV *gv = (GV *)sv_newmortal();
- gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
- if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
- sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
- else
- $arg = &PL_sv_undef;
- }
+ {
+ GV *gv = (GV *)sv_newmortal();
+ gv_init(gv, gv_stashpv("$Package",1),"__ANONIO__",10,0);
+ if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &PL_sv_undef;
+ }
--
2.21.1