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;
         }

Reply via email to