Alexandre Julliard : kernel32: Simplify K32GetPerformanceInfo().

Alexandre Julliard julliard at winehq.org
Thu May 30 16:27:12 CDT 2019


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 30 21:53:05 2019 +0200

kernel32: Simplify K32GetPerformanceInfo().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/cpu.c | 78 +++++++++++++++++++++++------------------------------
 1 file changed, 34 insertions(+), 44 deletions(-)

diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index 9445d0b..7668a10 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -209,14 +209,10 @@ BOOL WINAPI IsProcessorFeaturePresent ( DWORD feature )
  */
 BOOL WINAPI K32GetPerformanceInfo(PPERFORMANCE_INFORMATION info, DWORD size)
 {
-    union
-    {
-        SYSTEM_PERFORMANCE_INFORMATION performance;
-        SYSTEM_PROCESS_INFORMATION process;
-        SYSTEM_BASIC_INFORMATION basic;
-    } *sysinfo;
-    SYSTEM_PROCESS_INFORMATION *spi;
-    DWORD process_info_size;
+    SYSTEM_PERFORMANCE_INFORMATION perf;
+    SYSTEM_BASIC_INFORMATION basic;
+    SYSTEM_PROCESS_INFORMATION *process, *spi;
+    DWORD info_size;
     NTSTATUS status;
 
     TRACE( "(%p, %d)\n", info, size );
@@ -227,62 +223,56 @@ BOOL WINAPI K32GetPerformanceInfo(PPERFORMANCE_INFORMATION info, DWORD size)
         return FALSE;
     }
 
-    memset( info, 0, sizeof(*info) );
-    info->cb = sizeof(*info);
+    status = NtQuerySystemInformation( SystemPerformanceInformation, &perf, sizeof(perf), NULL );
+    if (status) goto err;
+    status = NtQuerySystemInformation( SystemBasicInformation, &basic, sizeof(basic), NULL );
+    if (status) goto err;
+
+    info->cb                 = sizeof(*info);
+    info->CommitTotal        = perf.TotalCommittedPages;
+    info->CommitLimit        = perf.TotalCommitLimit;
+    info->CommitPeak         = perf.PeakCommitment;
+    info->PhysicalTotal      = basic.MmNumberOfPhysicalPages;
+    info->PhysicalAvailable  = perf.AvailablePages;
+    info->SystemCache        = 0;
+    info->KernelTotal        = perf.PagedPoolUsage + perf.NonPagedPoolUsage;
+    info->KernelPaged        = perf.PagedPoolUsage;
+    info->KernelNonpaged     = perf.NonPagedPoolUsage;
+    info->PageSize           = basic.PageSize;
 
     /* fields from SYSTEM_PROCESS_INFORMATION */
-    NtQuerySystemInformation( SystemProcessInformation, NULL, 0, &process_info_size );
+    NtQuerySystemInformation( SystemProcessInformation, NULL, 0, &info_size );
     for (;;)
     {
-        sysinfo = HeapAlloc( GetProcessHeap(), 0, max(process_info_size, sizeof(*sysinfo)) );
-        if (!sysinfo)
+        process = HeapAlloc( GetProcessHeap(), 0, info_size );
+        if (!process)
         {
             SetLastError( ERROR_OUTOFMEMORY );
             return FALSE;
         }
-        status = NtQuerySystemInformation( SystemProcessInformation, &sysinfo->process,
-                                           process_info_size, &process_info_size );
+        status = NtQuerySystemInformation( SystemProcessInformation, process, info_size, &info_size );
         if (!status) break;
+        HeapFree( GetProcessHeap(), 0, process );
         if (status != STATUS_INFO_LENGTH_MISMATCH)
             goto err;
-        HeapFree( GetProcessHeap(), 0, sysinfo );
     }
-    for (spi = &sysinfo->process;; spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset))
+
+    info->HandleCount = info->ProcessCount = info->ThreadCount = 0;
+    spi = process;
+    for (;;)
     {
         info->ProcessCount++;
         info->HandleCount += spi->HandleCount;
         info->ThreadCount += spi->dwThreadCount;
         if (spi->NextEntryOffset == 0) break;
+        spi = (SYSTEM_PROCESS_INFORMATION *)((char *)spi + spi->NextEntryOffset);
     }
-
-    /* fields from SYSTEM_PERFORMANCE_INFORMATION */
-    status = NtQuerySystemInformation( SystemPerformanceInformation, &sysinfo->performance,
-                                       sizeof(sysinfo->performance), NULL );
-    if (status) goto err;
-    info->CommitTotal        = sysinfo->performance.TotalCommittedPages;
-    info->CommitLimit        = sysinfo->performance.TotalCommitLimit;
-    info->CommitPeak         = sysinfo->performance.PeakCommitment;
-    info->PhysicalAvailable  = sysinfo->performance.AvailablePages;
-    info->KernelTotal        = sysinfo->performance.PagedPoolUsage +
-                               sysinfo->performance.NonPagedPoolUsage;
-    info->KernelPaged        = sysinfo->performance.PagedPoolUsage;
-    info->KernelNonpaged     = sysinfo->performance.NonPagedPoolUsage;
-
-    /* fields from SYSTEM_BASIC_INFORMATION */
-    status = NtQuerySystemInformation( SystemBasicInformation, &sysinfo->basic,
-                                       sizeof(sysinfo->basic), NULL );
-    if (status) goto err;
-    info->PhysicalTotal = sysinfo->basic.MmNumberOfPhysicalPages;
-    info->PageSize      = sysinfo->basic.PageSize;
+    HeapFree( GetProcessHeap(), 0, process );
+    return TRUE;
 
 err:
-    HeapFree( GetProcessHeap(), 0, sysinfo );
-    if (status)
-    {
-        SetLastError( RtlNtStatusToDosError( status ) );
-        return FALSE;
-    }
-    return TRUE;
+    SetLastError( RtlNtStatusToDosError( status ) );
+    return FALSE;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list