Alexandre Julliard : ntdll: Rewrite the SystemProcessorPerformanceInformation handing to avoid code duplication .

Alexandre Julliard julliard at winehq.org
Fri Apr 15 10:19:24 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Apr 15 10:54:28 2011 +0200

ntdll: Rewrite the SystemProcessorPerformanceInformation handing to avoid code duplication.

Also include idle time in kernel time.

---

 dlls/ntdll/nt.c |   95 +++++++++++++-----------------------------------------
 1 files changed, 23 insertions(+), 72 deletions(-)

diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index fb89a42..ef5f703 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -1310,25 +1310,6 @@ void fill_cpu_info(void)
           cached_sci.Architecture, cached_sci.Level, cached_sci.Revision, cached_sci.FeatureSet);
 }
 
-static void fill_in_sppi(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *sppi, DWORD64 idle, DWORD64 sys, DWORD64 usr)
-{
-    DWORD64 steal;
-    sppi->IdleTime.QuadPart = idle * 10000000 / sysconf(_SC_CLK_TCK);
-    sppi->KernelTime.QuadPart = sys * 10000000 / sysconf(_SC_CLK_TCK);
-    sppi->UserTime.QuadPart = usr * 10000000 / sysconf(_SC_CLK_TCK);
-
-    /* Add 1% from idle time to kernel time, to make .NET happy */
-    steal = sppi->IdleTime.QuadPart / 100;
-    sppi->IdleTime.QuadPart -= steal;
-    sppi->KernelTime.QuadPart += steal;
-
-    /* DPC time */
-    sppi->Reserved1[0].QuadPart = 0;
-    /* Interrupt time */
-    sppi->Reserved1[1].QuadPart = 0;
-    sppi->Reserved2 = 0;
-}
-
 /******************************************************************************
  * NtQuerySystemInformation [NTDLL.@]
  * ZwQuerySystemInformation [NTDLL.@]
@@ -1605,66 +1586,36 @@ NTSTATUS WINAPI NtQuerySystemInformation(
                 FILE *cpuinfo = fopen("/proc/stat", "r");
                 if (cpuinfo)
                 {
+                    unsigned long clk_tck = sysconf(_SC_CLK_TCK);
                     unsigned long usr,nice,sys,idle,remainder[8];
-                    int count;
-                    char name[10];
+                    int i, count;
+                    char name[32];
                     char line[255];
 
                     /* first line is combined usage */
-                    if (fgets(line,255,cpuinfo))
-                        count = sscanf(line, "%s %lu %lu %lu %lu "
-                                       "%lu %lu %lu %lu %lu %lu %lu %lu",
-                                    name, &usr, &nice, &sys, &idle,
-                                    &remainder[0], &remainder[1], &remainder[2],
-                                    &remainder[3], &remainder[4], &remainder[5],
-                                    &remainder[6], &remainder[7]);
-                    else
-                        count = 0;
-                    /* we set this up in the for older non-smp enabled kernels */
-                    if (count >= 5 && strcmp(name, "cpu") == 0)
+                    while (fgets(line,255,cpuinfo))
                     {
-                        int i;
-                        for (i = 0; i + 5 < count; ++i)
-                            sys += remainder[i];
+                        count = sscanf(line, "%s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
+                                       name, &usr, &nice, &sys, &idle,
+                                       &remainder[0], &remainder[1], &remainder[2], &remainder[3],
+                                       &remainder[4], &remainder[5], &remainder[6], &remainder[7]);
+
+                        if (count < 5 || strncmp( name, "cpu", 3 )) break;
+                        for (i = 0; i + 5 < count; ++i) sys += remainder[i];
+                        sys += idle;
                         usr += nice;
-                        sppi = RtlAllocateHeap(GetProcessHeap(), 0,
-                                               sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
-                        fill_in_sppi(sppi, idle, sys, usr);
-                        cpus = 1;
-                        len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION);
-                    }
-
-                    do
-                    {
-                        if (fgets(line, 255, cpuinfo))
-                            count = sscanf(line, "%s %lu %lu %lu %lu "
-                                        "%lu %lu %lu %lu %lu %lu %lu %lu",
-                                        name, &usr, &nice, &sys, &idle,
-                                        &remainder[0], &remainder[1], &remainder[2],
-                                        &remainder[3], &remainder[4], &remainder[5],
-                                        &remainder[6], &remainder[7]);
+                        cpus = atoi( name + 3 ) + 1;
+                        if (cpus > out_cpus) break;
+                        len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * cpus;
+                        if (sppi)
+                            sppi = RtlReAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sppi, len );
                         else
-                            count = 0;
-                        if (count >= 5 && strncmp(name, "cpu", 3)==0)
-                        {
-                            int i;
-                            for (i = 0; i + 5 < count; ++i)
-                                sys += remainder[i];
-                            usr += nice;
-                            out_cpus --;
-                            if (name[3]=='0') /* first cpu */
-                                fill_in_sppi(sppi, idle, sys, usr);
-                            else /* new cpu */
-                            {
-                                len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * (cpus+1);
-                                sppi = RtlReAllocateHeap(GetProcessHeap(), 0, sppi, len);
-                                fill_in_sppi(sppi + cpus, idle, sys, usr);
-                                cpus++;
-                            }
-                        }
-                        else
-                            break;
-                    } while (out_cpus > 0);
+                            sppi = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, len );
+
+                        sppi[cpus-1].IdleTime.QuadPart   = (ULONGLONG)idle * 10000000 / clk_tck;
+                        sppi[cpus-1].KernelTime.QuadPart = (ULONGLONG)sys * 10000000 / clk_tck;
+                        sppi[cpus-1].UserTime.QuadPart   = (ULONGLONG)usr * 10000000 / clk_tck;
+                    }
                     fclose(cpuinfo);
                 }
             }




More information about the wine-cvs mailing list