Use GetSystemTimePreciseAsFileTime

When building for Windows 8 or later, use
GetSystemTimePreciseAsFileTime, otherwise do a run-time lookup of that
function and fall back to GetSystemTimeAsFileTime if it doesn't exist.

Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
Erik Boasson 2018-11-02 16:37:26 +01:00
parent 6e1df4c564
commit d05b0a4d13

View file

@ -24,11 +24,14 @@
#include <assert.h> #include <assert.h>
#if defined(_WIN32_WINNT) && _WIN32_WINNT > 0x0603 /* GetSystemTimePreciseAsFileTime was introduced with Windows 8, so
#define UseGetSystemTimePreciseAsFileTime starting from _WIN32_WINNET = 0x0602. When building for an older
version we can still check dynamically. */
/* GetSystemTimeAsFileTimeFunc is set when available (on Windows 8 and later). */ #if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0602
static VOID (WINAPI *GetSystemTimePreciseAsFileTimeFunc) (_Out_ LPFILTETIME); #define UseGetSystemTimePreciseAsFileTime
#else
static VOID (WINAPI *GetSystemTimeAsFileTimeFunc) (_Out_ LPFILTETIME) = GetSystemTimeAsFileTime;
static HANDLE Kernel32ModuleHandle; static HANDLE Kernel32ModuleHandle;
#endif #endif
@ -60,13 +63,9 @@ os__timeDefaultTimeGet(void)
* GetSystemTimeAdjustment. See for example OSPL-4394. * GetSystemTimeAdjustment. See for example OSPL-4394.
*/ */
#ifdef UseGetSystemTimePreciseAsFileTime #ifdef UseGetSystemTimePreciseAsFileTime
if (GetSystemTimePreciseAsFileTimeFunc) { GetSystemTimePreciseAsFileTime(&ft);
GetSystemTimePreciseAsFileTimeFunc(&ft);
} else {
GetSystemTimeAsFileTime(&ft);
}
#else #else
GetSystemTimeAsFileTime(&ft); GetSystemTimeAsFileTimeFunc(&ft);
#endif #endif
ns100.LowPart = ft.dwLowDateTime; ns100.LowPart = ft.dwLowDateTime;
ns100.HighPart = ft.dwHighDateTime; ns100.HighPart = ft.dwHighDateTime;
@ -79,8 +78,9 @@ os__timeDefaultTimeGet(void)
void void
os_timeModuleInit(void) os_timeModuleInit(void)
{ {
#ifdef UseGetSystemTimePreciseAsFileTime #ifndef UseGetSystemTimePreciseAsFileTime
/* Resolve the time-functions from the Kernel32-library. */ /* Resolve the time-functions from the Kernel32-library. */
VOID (WINAPI *f) (_Out_ LPFILTETIME);
/* This os_timeModuleInit is currently called from DllMain. This means /* This os_timeModuleInit is currently called from DllMain. This means
* we're not allowed to do LoadLibrary. One exception is "Kernel32.DLL", * we're not allowed to do LoadLibrary. One exception is "Kernel32.DLL",
@ -90,16 +90,19 @@ os_timeModuleInit(void)
Kernel32ModuleHandle = LoadLibrary("Kernel32.DLL"); Kernel32ModuleHandle = LoadLibrary("Kernel32.DLL");
assert(Kernel32ModuleHandle); assert(Kernel32ModuleHandle);
GetSystemTimePreciseAsFileTimeFunc = GetProcAddress(Kernel32ModuleHandle, "GetSystemTimePreciseAsFileTime"); f = GetProcAddress(Kernel32ModuleHandle, "GetSystemTimePreciseAsFileTime");
if (f != 0) {
GetSystemTimeAsFileTimeFunc = f;
}
#endif #endif
} }
void void
os_timeModuleExit(void) os_timeModuleExit(void)
{ {
#ifdef UseGetSystemTimePreciseAsFileTime #ifndef UseGetSystemTimePreciseAsFileTime
if (Kernel32ModuleHandle) { if (Kernel32ModuleHandle) {
GetSystemTimePreciseAsFileTimeFunc = NULL; GetSystemTimeAsFileTimeFunc = GetSystemTimeAsFileTime;
FreeLibrary(Kernel32ModuleHandle); FreeLibrary(Kernel32ModuleHandle);
Kernel32ModuleHandle = NULL; Kernel32ModuleHandle = NULL;
} }