diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2019-07-09 01:09:35 +0200 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2019-07-09 02:03:44 +0200 |
commit | f65905dd0ff464774f338db44d69925f98e1766c (patch) | |
tree | 52e22a8cb60fa3bb8f3ee226b8c7df5eddb08387 | |
parent | e22adfad195c22e98a47fd09c439ec96da247488 (diff) |
Optimize osl_getSystemTime on Windows
Make OffTime static const; don't cast from FILETIME to __int64 (see
https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime
for explanation: "it can cause alignment faults on 64-bit Windows").
Instead, cast in opposite direction: from 8-byte-aligned 64-bit integer
to FILETIME.
Change-Id: Iba61cc0198f8f25ef471d87e661c8801724b913d
Reviewed-on: https://gerrit.libreoffice.org/75256
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r-- | sal/osl/w32/time.cxx | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/sal/osl/w32/time.cxx b/sal/osl/w32/time.cxx index 135aab368fc8..ae499dcf8a8c 100644 --- a/sal/osl/w32/time.cxx +++ b/sal/osl/w32/time.cxx @@ -29,9 +29,7 @@ sal_Bool SAL_CALL osl_getSystemTime(TimeValue* pTimeVal) { - SYSTEMTIME SystemTime; - FILETIME CurTime, OffTime; - __int64 Value; + unsigned __int64 CurTime; typedef VOID (WINAPI *GetSystemTimePreciseAsFileTime_PROC)(LPFILETIME); @@ -46,25 +44,31 @@ sal_Bool SAL_CALL osl_getSystemTime(TimeValue* pTimeVal) // use ~1 microsecond resolution if available if (pGetSystemTimePreciseAsFileTime) - pGetSystemTimePreciseAsFileTime(&CurTime); + pGetSystemTimePreciseAsFileTime(reinterpret_cast<LPFILETIME>(&CurTime)); else { + SYSTEMTIME SystemTime; GetSystemTime(&SystemTime); - SystemTimeToFileTime(&SystemTime, &CurTime); + SystemTimeToFileTime(&SystemTime, reinterpret_cast<LPFILETIME>(&CurTime)); } - SystemTime.wYear = 1970; - SystemTime.wMonth = 1; - SystemTime.wDayOfWeek = 0; - SystemTime.wDay = 1; - SystemTime.wHour = 0; - SystemTime.wMinute = 0; - SystemTime.wSecond = 0; - SystemTime.wMilliseconds = 0; - - SystemTimeToFileTime(&SystemTime, &OffTime); + static const unsigned __int64 OffTime = [] { + SYSTEMTIME SystemTime; + SystemTime.wYear = 1970; + SystemTime.wMonth = 1; + SystemTime.wDayOfWeek = 0; + SystemTime.wDay = 1; + SystemTime.wHour = 0; + SystemTime.wMinute = 0; + SystemTime.wSecond = 0; + SystemTime.wMilliseconds = 0; + + unsigned __int64 ft; + SystemTimeToFileTime(&SystemTime, reinterpret_cast<LPFILETIME>(&ft)); + return ft; + }(); - Value = *reinterpret_cast<__int64 *>(&CurTime) - *reinterpret_cast<__int64 *>(&OffTime); + const unsigned __int64 Value = CurTime - OffTime; pTimeVal->Seconds = static_cast<unsigned long>(Value / 10000000L); pTimeVal->Nanosec = static_cast<unsigned long>((Value % 10000000L) * 100); |