In perl.git, the branch blead has been updated <https://perl5.git.perl.org/perl.git/commitdiff/17154110146fd1d2f11d4879051bb9dd2e0c653f?hp=8639f1585e4923c07198d76cd0bd4c39158d12ac>
- Log ----------------------------------------------------------------- commit 17154110146fd1d2f11d4879051bb9dd2e0c653f Merge: 8639f1585e d9cf960ca3 Author: Tony Cook <t...@develop-help.com> Date: Thu Aug 15 14:17:49 2019 +1000 Cleanup Time::HiRes commit d9cf960ca31df94beab2ff4ca45a0e5298ad0369 Author: Tony Cook <t...@develop-help.com> Date: Thu Aug 15 14:16:19 2019 +1000 bump $Time::HiRes::VERSION commit 3d8123f41098596f513aad80f45d84d9e4423d53 Author: Tomasz Konojacki <m...@xenu.pl> Date: Tue Jul 16 01:42:07 2019 +0200 Time::HiRes: remove workaround for an ancient Devel::PPPort bug It was fixed in Devel::PPPort 3.13_02. [perl #134288] commit d849ce1d5a905783e7b598fe7352794274b9c61c Author: Tomasz Konojacki <m...@xenu.pl> Date: Mon Jul 15 23:44:08 2019 +0200 Time::HiRes: remove the remains of MacOS classic support Perl dropped MacOS classic support ages ago. [perl #134288] commit 6abf31dff474e18c0edb8741e9ab319599bf6894 Author: Tomasz Konojacki <m...@xenu.pl> Date: Mon Jul 15 23:36:40 2019 +0200 Time::HiRes: remove code for perls older than 5.6 Both Makefile.PL and HiRes.pm contain "use 5.006", so it was dead code anyway. [perl #134288] commit 708180a33d23470bc69d1bb1cd9ef17cc3198a68 Author: Tomasz Konojacki <m...@xenu.pl> Date: Mon Jul 15 06:57:48 2019 +0200 Time::HiRes: normalize indentation The indendation style now (roughly) matches what was specified in the style guide in perlhack. This commit doesn't contain any functional changes. If you're seeing it in "git blame" output, try using -w switch, it will hide whitespace-only changes. [perl #134288] ----------------------------------------------------------------------- Summary of changes: dist/Time-HiRes/HiRes.pm | 112 +-- dist/Time-HiRes/HiRes.xs | 1620 ++++++++++++++++++-------------------- dist/Time-HiRes/Makefile.PL | 671 ++++++++-------- dist/Time-HiRes/t/Watchdog.pm | 54 +- dist/Time-HiRes/t/alarm.t | 204 ++--- dist/Time-HiRes/t/clock.t | 62 +- dist/Time-HiRes/t/gettimeofday.t | 6 +- dist/Time-HiRes/t/itimer.t | 18 +- dist/Time-HiRes/t/nanosleep.t | 6 +- dist/Time-HiRes/t/sleep.t | 6 +- dist/Time-HiRes/t/stat.t | 20 +- dist/Time-HiRes/t/time.t | 6 +- dist/Time-HiRes/t/ualarm.t | 60 +- dist/Time-HiRes/t/usleep.t | 14 +- dist/Time-HiRes/t/utime.t | 304 +++---- dist/Time-HiRes/typemap | 454 +++++------ 16 files changed, 1758 insertions(+), 1859 deletions(-) diff --git a/dist/Time-HiRes/HiRes.pm b/dist/Time-HiRes/HiRes.pm index d33a28b2a9..07b0707339 100644 --- a/dist/Time-HiRes/HiRes.pm +++ b/dist/Time-HiRes/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.9761'; + 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.9762'; 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); @@ -528,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 diff --git a/dist/Time-HiRes/HiRes.xs b/dist/Time-HiRes/HiRes.xs index 97e870c788..836e0c598a 100644 --- a/dist/Time-HiRes/HiRes.xs +++ b/dist/Time-HiRes/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) <zef...@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; @@ -149,24 +142,24 @@ typedef struct { 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,17 +167,17 @@ 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) /* 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) @@ -196,26 +189,27 @@ _gettimeofday(pTHX_ struct timeval *tp, void *not_used) 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; 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; - } + } } /* seconds since epoch */ @@ -226,54 +220,45 @@ _gettimeofday(pTHX_ struct timeval *tp, void *not_used) return 0; } -#endif - -#if defined(WIN32) && !defined(ATLEASTFIVEOHOHFIVE) -static unsigned int -sleep(unsigned int t) -{ - Sleep(t*1000); - return 0; -} -#endif +#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 +267,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 +386,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 +415,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 +430,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 +441,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 +460,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 +477,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 +552,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 +590,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 +606,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 +618,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 +643,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 +694,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 +719,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 +755,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; - } - - default: - break; + 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; + } } - } - 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 +922,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 +961,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 +985,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 +1003,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 +1037,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(); - OUTPUT: - RETVAL + 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 #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 +1163,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); - OUTPUT: - RETVAL + RETVAL = ualarm(useconds, uinterval); +# endif + + 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 ... 3279 lines suppressed ... -- Perl5 Master Repository