From 3979afceecb98780549fda60c7f75c8015bb33d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= Date: Fri, 1 Apr 2016 23:16:27 +0200 Subject: [PATCH] osl_getSystemTime: use high precision timer of W32, if available Change-Id: I7029f37639ead7a8b597ff39d1abcd295fab0551 --- sal/osl/w32/time.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/sal/osl/w32/time.c b/sal/osl/w32/time.c index 90d659a8cca0..325c57e9831a 100644 --- a/sal/osl/w32/time.c +++ b/sal/osl/w32/time.c @@ -35,10 +35,28 @@ sal_Bool SAL_CALL osl_getSystemTime(TimeValue* pTimeVal) FILETIME CurTime, OffTime; __int64 Value; + typedef BOOL (WINAPI *CheckTokenMembership_PROC)( HANDLE, PSID, PBOOL ); + + static HMODULE hModule = NULL; + static CheckTokenMembership_PROC pCheckTokenMembership = NULL; + OSL_ASSERT(pTimeVal != 0); - GetSystemTime(&SystemTime); - SystemTimeToFileTime(&SystemTime, &CurTime); + if ( !hModule ) + { + hModule = GetModuleHandleA( "Kernel32.dll" ); + if ( hModule ) + pCheckTokenMembership = (CheckTokenMembership_PROC)GetProcAddress( hModule, "GetSystemTimePreciseAsFileTime" ); + } + + // use ~1 microsecond resolution if available + if ( pCheckTokenMembership ) + GetSystemTimePreciseAsFileTime(&CurTime); + else + { + GetSystemTime(&SystemTime); + SystemTimeToFileTime(&SystemTime, &CurTime); + } SystemTime.wYear = 1970; SystemTime.wMonth = 1;