From: Jarkko Hietaniemi Date: Wed, 8 May 2002 23:48:12 +0000 (+0000) Subject: Rework #16506 some more. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6e3b076d535420d10e4d928a62445e7e7b46eef7;p=p5sagit%2Fp5-mst-13.2.git Rework #16506 some more. p4raw-id: //depot/perl@16507 --- diff --git a/ext/Time/HiRes/HiRes.xs b/ext/Time/HiRes/HiRes.xs index c38dc07..9d3586d 100644 --- a/ext/Time/HiRes/HiRes.xs +++ b/ext/Time/HiRes/HiRes.xs @@ -61,23 +61,30 @@ not_there: #if !defined(HAS_GETTIMEOFDAY) && defined(WIN32) #define HAS_GETTIMEOFDAY +/* shows up in winsock.h? +struct timeval { + long tv_sec; + long tv_usec; +} +*/ + typedef union { unsigned __int64 ft_i64; FILETIME ft_val; } FT_t; +/* 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 -/* Number of 100 nanosecond units from 1/1/1601 to 1/1/1970 */ #define EPOCH_BIAS Const64(116444736000000000) /* NOTE: This does not compute the timezone info (doing so can be expensive, * and appears to be unsupported even by glibc) */ -DllExport int -gettimeofday(struct timeval *tp, void *not_used) +int +gettimeofday (struct timeval *tp, void *not_used) { FT_t ft; @@ -92,8 +99,7 @@ gettimeofday(struct timeval *tp, void *not_used) return 0; } - -#endif /* WIN32 */ +#endif #if !defined(HAS_GETTIMEOFDAY) && defined(VMS) #define HAS_GETTIMEOFDAY @@ -534,7 +540,7 @@ myU2time(UV *ret) { struct timeval Tp; int status; - status = PerlProc_gettimeofday(&Tp,NULL); + status = gettimeofday (&Tp, NULL); ret[0] = Tp.tv_sec; ret[1] = Tp.tv_usec; return status; @@ -545,7 +551,7 @@ myNVtime() { struct timeval Tp; int status; - status = PerlProc_gettimeofday(&Tp,NULL); + status = gettimeofday (&Tp, NULL); return status == 0 ? Tp.tv_sec + (Tp.tv_usec / 1000000.) : -1.0; } @@ -578,7 +584,7 @@ usleep(useconds) PREINIT: struct timeval Ta, Tb; CODE: - PerlProc_gettimeofday(&Ta,NULL); + gettimeofday(&Ta, NULL); if (items > 0) { if (useconds > 1E6) { IV seconds = (IV) (useconds / 1E6); @@ -594,7 +600,7 @@ usleep(useconds) usleep((UV)useconds); } else PerlProc_pause(); - PerlProc_gettimeofday(&Tb,NULL); + gettimeofday(&Tb, NULL); #if 0 printf("[%ld %ld] [%ld %ld]\n", Tb.tv_sec, Tb.tv_usec, Ta.tv_sec, Ta.tv_usec); #endif @@ -608,7 +614,7 @@ sleep(...) PREINIT: struct timeval Ta, Tb; CODE: - PerlProc_gettimeofday(&Ta,NULL); + gettimeofday(&Ta, NULL); if (items > 0) { NV seconds = SvNV(ST(0)); if (seconds >= 0.0) { @@ -620,7 +626,7 @@ sleep(...) croak("Time::HiRes::sleep(%"NVgf"): negative time not invented yet", seconds); } else PerlProc_pause(); - PerlProc_gettimeofday(&Tb,NULL); + gettimeofday(&Tb, NULL); #if 0 printf("[%ld %ld] [%ld %ld]\n", Tb.tv_sec, Tb.tv_usec, Ta.tv_sec, Ta.tv_usec); #endif @@ -669,7 +675,7 @@ gettimeofday() struct timezone Tz; PPCODE: int status; - status = PerlProc_gettimeofday(&Tp,&Tz); + status = gettimeofday (&Tp, &Tz); Tp.tv_sec += Tz.tz_minuteswest * 60; /* adjust for TZ */ if (GIMME == G_ARRAY) { @@ -689,7 +695,7 @@ time() struct timezone Tz; CODE: int status; - status = PerlProc_gettimeofday(&Tp,&Tz); + status = gettimeofday (&Tp, &Tz); Tp.tv_sec += Tz.tz_minuteswest * 60; /* adjust for TZ */ RETVAL = Tp.tv_sec + (Tp.tv_usec / 1000000.0); OUTPUT: @@ -702,7 +708,7 @@ gettimeofday() struct timeval Tp; PPCODE: int status; - status = PerlProc_gettimeofday(&Tp,NULL); + status = gettimeofday (&Tp, NULL); if (GIMME == G_ARRAY) { EXTEND(sp, 2); PUSHs(sv_2mortal(newSViv(Tp.tv_sec))); @@ -718,7 +724,7 @@ time() struct timeval Tp; CODE: int status; - status = PerlProc_gettimeofday(&Tp,NULL); + status = gettimeofday (&Tp, NULL); RETVAL = Tp.tv_sec + (Tp.tv_usec / 1000000.); OUTPUT: RETVAL diff --git a/win32/win32.c b/win32/win32.c index 59e7ee8..06068bf 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1651,12 +1651,36 @@ win32_utime(const char *filename, struct utimbuf *times) return rc; } +typedef union { + unsigned __int64 ft_i64; + FILETIME ft_val; +} FT_t; + +#ifdef __GNUC__ +#define Const64(x) x##LL +#else +#define Const64(x) x##i64 +#endif +/* Number of 100 nanosecond units from 1/1/1601 to 1/1/1970 */ +#define EPOCH_BIAS Const64(116444736000000000) + /* NOTE: This does not compute the timezone info (doing so can be expensive, * and appears to be unsupported even by glibc) */ DllExport int win32_gettimeofday(struct timeval *tp, void *not_used) { - return PerlProc_gettimeofday(tp, not_used); // Implemented in Time::HiRes. + FT_t ft; + + /* this returns time in 100-nanosecond units (i.e. tens of usecs) */ + GetSystemTimeAsFileTime(&ft.ft_val); + + /* seconds since epoch */ + tp->tv_sec = (long)((ft.ft_i64 - EPOCH_BIAS) / Const64(10000000)); + + /* microseconds remaining */ + tp->tv_usec = (long)((ft.ft_i64 / Const64(10)) % Const64(1000000)); + + return 0; } DllExport int