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:
parent
6e1df4c564
commit
d05b0a4d13
1 changed files with 17 additions and 14 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue