summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/os/os_time.c
diff options
context:
space:
mode:
authorFrank Richter <[email protected]>2017-08-15 15:46:35 +0200
committerBrian Paul <[email protected]>2017-08-16 18:32:47 -0600
commit7fb7287ce72066db7dffd918226bf15c3131a871 (patch)
tree8f96b7dda5fb934862538f4405d75b56b347b512 /src/gallium/auxiliary/os/os_time.c
parentd90e05ad487e9fe7e17c293814ac8549d9d686d8 (diff)
gallium/os: fix os_time_get_nano() to roll over less
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102241 Cc: [email protected] Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Jose Fonseca <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/os/os_time.c')
-rw-r--r--src/gallium/auxiliary/os/os_time.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/os/os_time.c b/src/gallium/auxiliary/os/os_time.c
index e169139034c..e4a1cae641a 100644
--- a/src/gallium/auxiliary/os/os_time.c
+++ b/src/gallium/auxiliary/os/os_time.c
@@ -69,10 +69,17 @@ os_time_get_nano(void)
static LARGE_INTEGER frequency;
LARGE_INTEGER counter;
+ int64_t secs, nanosecs;
if(!frequency.QuadPart)
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&counter);
- return counter.QuadPart*INT64_C(1000000000)/frequency.QuadPart;
+ /* Compute seconds and nanoseconds parts separately to
+ * reduce severity of precision loss.
+ */
+ secs = counter.QuadPart / frequency.QuadPart;
+ nanosecs = (counter.QuadPart % frequency.QuadPart) * INT64_C(1000000000)
+ / frequency.QuadPart;
+ return secs*INT64_C(1000000000) + nanosecs;
#else