From 1feff82129fb1f64934559e3c209928033c632fe Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 18 Sep 2018 22:06:23 -0400 Subject: [PATCH] roken: gettimeofday using GetSystemTimePreciseAsFileTime GetSystemTimeAsFileTime() has 16ms precision. GetSystemTimePreciseAsFileTime() has <1ns precision but is only available on Windows 8 or later. This change dynamically loads GetSystemTimePreciseAsFileTime() if it is available. Change-Id: Ib9c616c01948384e6b256ac9b6023f1e39673613 --- lib/roken/gettimeofday.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/roken/gettimeofday.c b/lib/roken/gettimeofday.c index a53b96f4f..918b6f686 100644 --- a/lib/roken/gettimeofday.c +++ b/lib/roken/gettimeofday.c @@ -37,6 +37,10 @@ #ifdef _WIN32 +typedef BOOL (WINAPI *LPFN_GETSYSTEMTIME) (LPFILETIME); + +static LPFN_GETSYSTEMTIME lpGetSystemTime = NULL; + ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL gettimeofday (struct timeval *tp, void *ignore) { @@ -44,7 +48,20 @@ gettimeofday (struct timeval *tp, void *ignore) ULARGE_INTEGER li; ULONGLONG ull; - GetSystemTimeAsFileTime(&ft); + if (lpGetSystemTime == NULL) { + HANDLE h1; + LPFN_GETSYSTEMTIME fn; + + h1 = GetModuleHandle(TEXT("kernel32.dll")); /* no refcount increase */ + fn = (LPFN_GETSYSTEMTIME)GetProcAddress(h1, + "GetSystemTimePreciseAsFileTime"); + if (fn == NULL) + fn = (LPFN_GETSYSTEMTIME)GetProcAddress(h1, + "GetSystemTimeAsFileTime"); + lpGetSystemTime = fn; + } + + lpGetSystemTime(&ft); li.LowPart = ft.dwLowDateTime; li.HighPart = ft.dwHighDateTime; ull = li.QuadPart; @@ -57,7 +74,6 @@ gettimeofday (struct timeval *tp, void *ignore) return 0; } - #else /*