diff options
author | Eric Blake <eblake@redhat.com> | 2009-10-13 06:26:33 +0400 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2009-10-13 06:26:33 +0400 |
commit | b8a35083c6c8ff967576ba6e9978323124506599 (patch) | |
tree | 4706e1f2df3c6dd2bf39017a50218ffa25ab5c04 /winsup/cygwin/times.cc | |
parent | 2fc007681e372282054c72dc95cee5f79e7d4b65 (diff) |
Improve clock_gettime and utimensat resolution.
* hires.h (hires_ms): Change initime_us to initime_ns, with 10x
more resolution.
(hires_ms::nsecs): New prototype.
(hires_ms::usecs, hires_ms::msecs, hires_ms::uptime): Adjust.
* times.cc (systime_ns): New helper function.
(hires_ms::prime): Use it for more resolution.
(hires_ms::usecs): Change to...
(hires_ms::nsecs): ...with more resolution.
(clock_gettime): Use more resolution.
(systime): Rewrite in terms of systime_ns.
(timespec_to_filetime): Rewrite math to reflect true operation.
* fhandler_disk_file.cc (utimens_fs): Use higher resolution.
Diffstat (limited to 'winsup/cygwin/times.cc')
-rw-r--r-- | winsup/cygwin/times.cc | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc index f89a72a5e..573c4c0db 100644 --- a/winsup/cygwin/times.cc +++ b/winsup/cygwin/times.cc @@ -29,7 +29,7 @@ details. */ #define NSPERSEC 10000000LL static inline LONGLONG -systime () +systime_ns () { LARGE_INTEGER x; FILETIME ft; @@ -37,10 +37,15 @@ systime () 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 microseconds */ return x.QuadPart; } +static inline LONGLONG +systime () +{ + return systime_ns () / 10; +} + /* Cygwin internal */ static unsigned long long __stdcall __to_clock_t (FILETIME *src, int flag) @@ -191,7 +196,7 @@ timespec_to_filetime (const struct timespec *time_in, FILETIME *out) else { long long x = time_in->tv_sec * NSPERSEC + - time_in->tv_nsec / (NSPERSEC/100000) + FACTOR; + time_in->tv_nsec / (1000000000/NSPERSEC) + FACTOR; out->dwHighDateTime = x >> 32; out->dwLowDateTime = x; } @@ -667,7 +672,7 @@ hires_ms::prime () { int priority = GetThreadPriority (GetCurrentThread ()); SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); - initime_us = systime () - (((LONGLONG) timeGetTime ()) * 1000LL); + initime_ns = systime_ns () - (((LONGLONG) timeGetTime ()) * 10000LL); inited = true; SetThreadPriority (GetCurrentThread (), priority); } @@ -675,18 +680,18 @@ hires_ms::prime () } LONGLONG -hires_ms::usecs () +hires_ms::nsecs () { if (!inited) prime (); - LONGLONG t = systime (); - LONGLONG res = initime_us + (((LONGLONG) timeGetTime ()) * 1000LL); - if (res < (t - 40000LL)) + LONGLONG t = systime_ns (); + LONGLONG res = initime_ns + (((LONGLONG) timeGetTime ()) * 10000LL); + if (res < (t - 40 * 10000LL)) { inited = false; prime (); - res = initime_us + (((LONGLONG) timeGetTime ()) * 1000LL); + res = initime_ns + (((LONGLONG) timeGetTime ()) * 10000LL); } return res; } @@ -700,12 +705,12 @@ clock_gettime (clockid_t clk_id, struct timespec *tp) return -1; } - LONGLONG now = gtod.usecs (); + LONGLONG now = gtod.nsecs (); if (now == (LONGLONG) -1) return -1; - tp->tv_sec = now / 1000000; - tp->tv_nsec = (now % 1000000) * 1000; + tp->tv_sec = now / NSPERSEC; + tp->tv_nsec = (now % NSPERSEC) * (1000000000 / NSPERSEC); return 0; } |