sal/osl/w32/file_dirvol.cxx | 99 ++++++++++++++++++++++---------------------- sal/osl/w32/filetime.hxx | 18 -------- sal/osl/w32/process.cxx | 16 ++----- 3 files changed, 57 insertions(+), 76 deletions(-)
New commits: commit 964031216cdb28280425a03edb0e4117ee55fbd3 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Sun Jul 13 23:32:37 2025 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Mon Jul 14 11:40:23 2025 +0200 Simplify TimeValueToFileTime / FileTimeToTimeValue ... and use it in osl_getProcessInfo for FILETIME representing durations Move getFiletime/setFiletime from filetime.hxx to file_dirvol.cxx, that is now the only user of the functions. Change-Id: Iebbc364fbce6187bf823bf7c12b3c5705769c02b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187821 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Jenkins diff --git a/sal/osl/w32/file_dirvol.cxx b/sal/osl/w32/file_dirvol.cxx index 6be7a1152710..ad92c6f05087 100644 --- a/sal/osl/w32/file_dirvol.cxx +++ b/sal/osl/w32/file_dirvol.cxx @@ -36,66 +36,67 @@ #include <memory> -BOOL TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime) +namespace { - SYSTEMTIME BaseSysTime; - FILETIME BaseFileTime; - FILETIME FTime; - bool fSuccess = false; +__int64 getFiletime(FILETIME const& ft) +{ + return (DWORD64(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +} + +void setFiletime(FILETIME& ft, __int64 value) +{ + ft.dwHighDateTime = value >> 32; + ft.dwLowDateTime = value & 0xFFFFFFFF; +} - BaseSysTime.wYear = 1970; - BaseSysTime.wMonth = 1; - BaseSysTime.wDayOfWeek = 0; - BaseSysTime.wDay = 1; - BaseSysTime.wHour = 0; - BaseSysTime.wMinute = 0; - BaseSysTime.wSecond = 0; - BaseSysTime.wMilliseconds = 0; +__int64 getBaseFileTime() +{ + static const __int64 baseFileTime = [] + { + const SYSTEMTIME BaseSysTime{ .wYear = 1970, + .wMonth = 1, + .wDayOfWeek = 0, + .wDay = 1, + .wHour = 0, + .wMinute = 0, + .wSecond = 0, + .wMilliseconds = 0 }; + FILETIME BaseFileTime; + [[maybe_unused]] bool bResult = SystemTimeToFileTime(&BaseSysTime, &BaseFileTime); + assert(bResult); + return getFiletime(BaseFileTime); + }(); + return baseFileTime; +} +} +BOOL TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime) +{ if (cpTimeVal==nullptr) - return fSuccess; + return false; - if ( SystemTimeToFileTime(&BaseSysTime, &BaseFileTime) ) - { - __int64 timeValue; + __int64 localTime = cpTimeVal->Seconds * __int64(10000000) + cpTimeVal->Nanosec / 100; + __int64 timeValue = getBaseFileTime() + localTime; - __int64 localTime = cpTimeVal->Seconds*__int64(10000000)+cpTimeVal->Nanosec/100; - osl::detail::setFiletime(FTime, localTime); - fSuccess = 0 <= (timeValue= osl::detail::getFiletime(BaseFileTime) + osl::detail::getFiletime(FTime)); - if (fSuccess) - osl::detail::setFiletime(*pFTime, timeValue); - } - return fSuccess; + if (timeValue < 0) + return false; + + setFiletime(*pFTime, timeValue); + return true; } -BOOL FileTimeToTimeValue(const FILETIME *cpFTime, TimeValue *pTimeVal) +BOOL FileTimeToTimeValue(const FILETIME* cpFTime, TimeValue* pTimeVal, bool bDuration) { - SYSTEMTIME BaseSysTime; - FILETIME BaseFileTime; - bool fSuccess = false; /* Assume failure */ - - BaseSysTime.wYear = 1970; - BaseSysTime.wMonth = 1; - BaseSysTime.wDayOfWeek = 0; - BaseSysTime.wDay = 1; - BaseSysTime.wHour = 0; - BaseSysTime.wMinute = 0; - BaseSysTime.wSecond = 0; - BaseSysTime.wMilliseconds = 0; - - if ( SystemTimeToFileTime(&BaseSysTime, &BaseFileTime) ) - { - __int64 Value; + __int64 localTime = getFiletime(*cpFTime); + if (!bDuration) + localTime -= getBaseFileTime(); - fSuccess = 0 <= (Value = osl::detail::getFiletime(*cpFTime) - osl::detail::getFiletime(BaseFileTime)); + if (localTime < 0) + return false; - if ( fSuccess ) - { - pTimeVal->Seconds = static_cast<unsigned long>(Value / 10000000L); - pTimeVal->Nanosec = static_cast<unsigned long>((Value % 10000000L) * 100); - } - } - return fSuccess; + pTimeVal->Seconds = static_cast<unsigned long>(localTime / 10000000L); + pTimeVal->Nanosec = static_cast<unsigned long>((localTime % 10000000L) * 100); + return true; } namespace diff --git a/sal/osl/w32/filetime.hxx b/sal/osl/w32/filetime.hxx index dc355591adce..7b51baf1b6bf 100644 --- a/sal/osl/w32/filetime.hxx +++ b/sal/osl/w32/filetime.hxx @@ -18,22 +18,8 @@ #include <osl/time.h> BOOL TimeValueToFileTime(TimeValue const* cpTimeVal, FILETIME* pFTime); - -BOOL FileTimeToTimeValue(FILETIME const* cpFTime, TimeValue* pTimeVal); - -namespace osl::detail -{ -inline __int64 getFiletime(FILETIME const& ft) -{ - return (DWORD64(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; -} - -inline void setFiletime(FILETIME& ft, __int64 value) -{ - ft.dwHighDateTime = value >> 32; - ft.dwLowDateTime = value & 0xFFFFFFFF; -} -} +// bDuration means cpFTime contains a time interval, not a point in time +BOOL FileTimeToTimeValue(FILETIME const* cpFTime, TimeValue* pTimeVal, bool bDuration = false); #endif diff --git a/sal/osl/w32/process.cxx b/sal/osl/w32/process.cxx index 259e18c2f781..20b6a2797d9e 100644 --- a/sal/osl/w32/process.cxx +++ b/sal/osl/w32/process.cxx @@ -27,6 +27,7 @@ #include <osl/mutex.hxx> #include <osl/nlsupport.h> #include <o3tl/char16_t2wchar_t.hxx> +#include <o3tl/temporary.hxx> #include <systools/win32/extended_max_path.hxx> #include "filetime.hxx" @@ -228,20 +229,13 @@ oslProcessError SAL_CALL osl_getProcessInfo(oslProcess Process, oslProcessData F if (Fields & osl_Process_CPUTIMES) { - FILETIME CreationTime, ExitTime, KernelTime, UserTime; + FILETIME KernelTime, UserTime; - if (GetProcessTimes(hProcess, &CreationTime, &ExitTime, + if (GetProcessTimes(hProcess, &o3tl::temporary(FILETIME()), &o3tl::temporary(FILETIME()), &KernelTime, &UserTime)) { - __int64 Value; - - Value = osl::detail::getFiletime(UserTime); - pInfo->UserTime.Seconds = static_cast<unsigned long>(Value / 10000000L); - pInfo->UserTime.Nanosec = static_cast<unsigned long>((Value % 10000000L) * 100); - - Value = osl::detail::getFiletime(KernelTime); - pInfo->SystemTime.Seconds = static_cast<unsigned long>(Value / 10000000L); - pInfo->SystemTime.Nanosec = static_cast<unsigned long>((Value % 10000000L) * 100); + FileTimeToTimeValue(&UserTime, &pInfo->UserTime, true); + FileTimeToTimeValue(&KernelTime, &pInfo->SystemTime, true); pInfo->Fields |= osl_Process_CPUTIMES; }