[PATCH 2/7] ntdll: implement setting SYSTEM_PERFORMANCE_INFORMATION.IdleTime on FreeBSD

Damjan Jovanovic damjan.jov at gmail.com
Sun Oct 31 10:47:50 CDT 2021


Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
---
 dlls/ntdll/unix/system.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)
-------------- next part --------------
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index 6640a66597b..91184b12dba 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -1852,6 +1852,7 @@ static void get_performance_info( SYSTEM_PERFORMANCE_INFORMATION *info )
 
     memset( info, 0, sizeof(*info) );
 
+#if defined(linux)
     if ((fp = fopen("/proc/uptime", "r")))
     {
         double uptime, idle_time;
@@ -1860,12 +1861,28 @@ static void get_performance_info( SYSTEM_PERFORMANCE_INFORMATION *info )
         fclose(fp);
         info->IdleTime.QuadPart = 10000000 * idle_time;
     }
-    else
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+    {
+        static int clockrate_name[] = { CTL_KERN, KERN_CLOCKRATE };
+        size_t size = 0;
+        struct clockinfo clockrate;
+        long ptimes[CPUSTATES];
+
+        size = sizeof(clockrate);
+        if (!sysctl(clockrate_name, 2, &clockrate, &size, NULL, 0))
+        {
+            size = sizeof(ptimes);
+            if (!sysctlbyname("kern.cp_time", ptimes, &size, NULL, 0))
+                info->IdleTime.QuadPart = (ULONGLONG)ptimes[CP_IDLE] * 10000000 / clockrate.stathz;
+        }
+    }
+#else
     {
         static ULONGLONG idle;
         /* many programs expect IdleTime to change so fake change */
         info->IdleTime.QuadPart = ++idle;
     }
+#endif
 
 #ifdef linux
     if ((fp = fopen("/proc/meminfo", "r")))


More information about the wine-devel mailing list