aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-12-07 22:28:49 +0000
committerChristopher Faylor <me@cgf.cx>2005-12-07 22:28:49 +0000
commit6c9a5ebbfcb3de5c66e83aae630a6a44124ad372 (patch)
treec195b15a15c2df4ef5b6ecc64291053ac3735dc9 /winsup
parentc09178b052512d51998d03b1a26991192d239ac5 (diff)
downloadnewlib-6c9a5ebbfcb3de5c66e83aae630a6a44124ad372.zip
newlib-6c9a5ebbfcb3de5c66e83aae630a6a44124ad372.tar.gz
newlib-6c9a5ebbfcb3de5c66e83aae630a6a44124ad372.tar.bz2
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog17
-rw-r--r--winsup/cygwin/fhandler_proc.cc2
-rw-r--r--winsup/cygwin/hires.h5
-rw-r--r--winsup/cygwin/select.cc4
-rw-r--r--winsup/cygwin/times.cc54
5 files changed, 50 insertions, 32 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d96be78..cf95c28 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,20 @@
+2005-12-07 Christopher Faylor <cgf@timesys.com>
+
+ * 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 <corinna@vinschen.de>
* fhandler_proc.cc (format_proc_partitions): Use modern IOCTLs
diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc
index af603ad..0ecfc0d 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 ddc6705..3c7bd27 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 1350a2b..073e8bc 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 822c9b3..793864a 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;
}