From 6c9a5ebbfcb3de5c66e83aae630a6a44124ad372 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Wed, 7 Dec 2005 22:28:49 +0000 Subject: [PATCH] * hires.h (hires_ms::initime_ms): Delete. (hires_ms::initime_us): Just define as LONGLONG. (hires_ms::uptime): New function. * select.cc (select_stuff::wait): Use gtod for timing to attempt to avoid windows 32 bit wraparound. * times.cc (systime): New function. (times): Replace GetTickCount with gtod.uptime. (hires_us::prime): Use systime() to calculate system time rather than calling GetSystemTimeAsFileTime directly. (hires_ms::prime): Ditto. Eliminate initime_ms. (hires_ms::usecs): Try harder to detect wraparound. * fhandler_proc.cc (format_proc_partitions): Set drive_size to zero to avoid a compiler warning. --- winsup/cygwin/ChangeLog | 17 +++++++++++ winsup/cygwin/fhandler_proc.cc | 2 ++ winsup/cygwin/hires.h | 5 ++-- winsup/cygwin/select.cc | 4 +-- winsup/cygwin/times.cc | 54 ++++++++++++++++------------------ 5 files changed, 50 insertions(+), 32 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index d96be78e6..cf95c2865 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,20 @@ +2005-12-07 Christopher Faylor + + * hires.h (hires_ms::initime_ms): Delete. + (hires_ms::initime_us): Just define as LONGLONG. + (hires_ms::uptime): New function. + * select.cc (select_stuff::wait): Use gtod for timing to attempt to + avoid windows 32 bit wraparound. + * times.cc (systime): New function. + (times): Replace GetTickCount with gtod.uptime. + (hires_us::prime): Use systime() to calculate system time rather than + calling GetSystemTimeAsFileTime directly. + (hires_ms::prime): Ditto. Eliminate initime_ms. + (hires_ms::usecs): Try harder to detect wraparound. + + * fhandler_proc.cc (format_proc_partitions): Set drive_size to zero to + avoid a compiler warning. + 2005-12-07 Corinna Vinschen * fhandler_proc.cc (format_proc_partitions): Use modern IOCTLs diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc index af603ade2..0ecfc0d5d 100644 --- a/winsup/cygwin/fhandler_proc.cc +++ b/winsup/cygwin/fhandler_proc.cc @@ -997,6 +997,8 @@ format_proc_partitions (char *destbuf, size_t maxsize) * dg->SectorsPerTrack * dg->BytesPerSector; } + else + drive_size = 0; if (!pi && !pix && !dg) debug_printf ("DeviceIoControl %E"); else diff --git a/winsup/cygwin/hires.h b/winsup/cygwin/hires.h index ddc670568..3c7bd2722 100644 --- a/winsup/cygwin/hires.h +++ b/winsup/cygwin/hires.h @@ -39,13 +39,14 @@ class hires_us : hires_base class hires_ms : hires_base { - DWORD initime_ms; - LARGE_INTEGER initime_us; + LONGLONG initime_us; void prime (); public: LONGLONG usecs (); + LONGLONG msecs () {return usecs () / 1000LL;} UINT dmsecs () { return timeGetTime (); } UINT resolution (); + LONGLONG uptime () {return (usecs () - initime_us) / 1000LL;} }; extern hires_ms gtod; diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 1350a2b03..073e8bcad 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -276,7 +276,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, continue; } - DWORD start_time = GetTickCount (); /* Record the current time for later use. */ + LONGLONG start_time = gtod.msecs (); /* Record the current time for later use. */ debug_printf ("m %d, ms %u", m, ms); for (;;) @@ -330,7 +330,7 @@ select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, } select_printf ("recalculating ms"); - DWORD now = GetTickCount (); + LONGLONG now = gtod.msecs (); if (now > (start_time + ms)) { select_printf ("timed out after verification"); diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc index 822c9b3e1..793864a7a 100644 --- a/winsup/cygwin/times.cc +++ b/winsup/cygwin/times.cc @@ -32,9 +32,22 @@ details. */ #define FACTOR (0x19db1ded53e8000LL) #define NSPERSEC 10000000LL +static inline LONGLONG +systime () +{ + LARGE_INTEGER x; + FILETIME ft; + GetSystemTimeAsFileTime (&ft); + x.HighPart = ft.dwHighDateTime; + x.LowPart = ft.dwLowDateTime; + x.QuadPart -= FACTOR; /* Add conversion factor for UNIX vs. Windows base time */ + x.QuadPart /= 10; /* Convert to milliseconds */ + return x.QuadPart; +} + /* Cygwin internal */ static unsigned long long __stdcall -__to_clock_t (FILETIME * src, int flag) +__to_clock_t (FILETIME *src, int flag) { unsigned long long total = ((unsigned long long) src->dwHighDateTime << 32) + ((unsigned)src->dwLowDateTime); syscall_printf ("dwHighDateTime %u, dwLowDateTime %u", src->dwHighDateTime, src->dwLowDateTime); @@ -44,7 +57,7 @@ __to_clock_t (FILETIME * src, int flag) total -= FACTOR; total /= (unsigned long long) (NSPERSEC / CLOCKS_PER_SEC); - syscall_printf ("total %08x %08x", (unsigned)(total>>32), (unsigned)(total)); + syscall_printf ("total %08x %08x", (unsigned) (total>>32), (unsigned) (total)); return total; } @@ -58,10 +71,10 @@ times (struct tms *buf) if (efault.faulted (EFAULT)) return ((clock_t) -1); - DWORD ticks = GetTickCount (); + LONGLONG ticks = gtod.uptime (); /* Ticks is in milliseconds, convert to our ticks. Use long long to prevent overflow. */ - clock_t tc = (clock_t) ((long long) ticks * CLOCKS_PER_SEC / 1000); + clock_t tc = (clock_t) (ticks * CLOCKS_PER_SEC / 1000); if (wincap.has_get_process_times ()) { GetProcessTimes (hMainProc, &creation_time, &exit_time, @@ -569,7 +582,6 @@ hires_us::prime () return; } - FILETIME f; int priority = GetThreadPriority (GetCurrentThread ()); SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); @@ -580,15 +592,10 @@ hires_us::prime () return; } - GetSystemTimeAsFileTime (&f); - SetThreadPriority (GetCurrentThread (), priority); - - inited = 1; - primed_ft.HighPart = f.dwHighDateTime; - primed_ft.LowPart = f.dwLowDateTime; - primed_ft.QuadPart -= FACTOR; - primed_ft.QuadPart /= 10; + primed_ft.QuadPart = systime (); freq = (double) ((double) 1000000. / (double) ifreq.QuadPart); + inited = true; + SetThreadPriority (GetCurrentThread (), priority); } LONGLONG @@ -620,18 +627,11 @@ hires_ms::prime () { if (!inited) { - FILETIME f; int priority = GetThreadPriority (GetCurrentThread ()); SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); - initime_ms = timeGetTime (); - GetSystemTimeAsFileTime (&f); + initime_us = systime () - (((LONGLONG) timeGetTime ()) * 1000LL); + inited = true; SetThreadPriority (GetCurrentThread (), priority); - - initime_us.HighPart = f.dwHighDateTime; - initime_us.LowPart = f.dwLowDateTime; - initime_us.QuadPart -= FACTOR; - initime_us.QuadPart /= 10; - inited = 1; } return; } @@ -642,15 +642,13 @@ hires_ms::usecs () if (!inited) prime (); - DWORD now = timeGetTime (); - if ((int) (now - initime_ms) < 0) + LONGLONG res = initime_us + (((LONGLONG) timeGetTime ()) * 1000LL); + if (res <= systime ()) { - inited = 0; + inited = false; prime (); - now = timeGetTime (); + res = initime_us + (((LONGLONG) timeGetTime ()) * 1000LL); } - // FIXME: Not sure how this will handle the 49.71 day wrap around - LONGLONG res = initime_us.QuadPart + ((LONGLONG) (now - initime_ms) * 1000); return res; }