Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2009-10-13 06:26:33 +0400
committerEric Blake <eblake@redhat.com>2009-10-13 06:26:33 +0400
commitb8a35083c6c8ff967576ba6e9978323124506599 (patch)
tree4706e1f2df3c6dd2bf39017a50218ffa25ab5c04 /winsup/cygwin/times.cc
parent2fc007681e372282054c72dc95cee5f79e7d4b65 (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.cc29
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;
}