Damjan Jovanovic : ntdll: Implement setting SYSTEM_PERFORMANCE_INFORMATION.IdleTime on FreeBSD.

Alexandre Julliard julliard at winehq.org
Wed Nov 3 16:42:01 CDT 2021


Module: wine
Branch: master
Commit: d5406d028b9b735a1f727d7b500494a724b7eaad
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d5406d028b9b735a1f727d7b500494a724b7eaad

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Sun Oct 31 17:47:50 2021 +0200

ntdll: Implement setting SYSTEM_PERFORMANCE_INFORMATION.IdleTime on FreeBSD.

Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/system.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

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-cvs mailing list