From 67755d2593c372539005fab2aaf01fa1c61fffbe Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Sun, 6 Mar 2011 18:17:06 +0100 Subject: [PATCH] ntdll: Fix time units for SystemPerformanceProcessorInformation, and steal idle time for kernel time. --- dlls/ntdll/nt.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index 8b4f09c76eb..fb89a421a96 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -1310,6 +1310,25 @@ 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.@] @@ -1610,11 +1629,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( usr += nice; sppi = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)); - sppi->IdleTime.QuadPart = idle; - sppi->KernelTime.QuadPart = sys; - sppi->UserTime.QuadPart = usr+nice; - sppi->Reserved1[0].QuadPart = 0; - sppi->Reserved1[1].QuadPart = 0; + fill_in_sppi(sppi, idle, sys, usr); cpus = 1; len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION); } @@ -1638,20 +1653,12 @@ NTSTATUS WINAPI NtQuerySystemInformation( usr += nice; out_cpus --; if (name[3]=='0') /* first cpu */ - { - sppi->IdleTime.QuadPart = idle; - sppi->KernelTime.QuadPart = sys; - sppi->UserTime.QuadPart = usr; - } + fill_in_sppi(sppi, idle, sys, usr); else /* new cpu */ { len = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * (cpus+1); sppi = RtlReAllocateHeap(GetProcessHeap(), 0, sppi, len); - sppi[cpus].IdleTime.QuadPart = idle; - sppi[cpus].KernelTime.QuadPart = sys; - sppi[cpus].UserTime.QuadPart = usr; - sppi[cpus].Reserved1[0].QuadPart = 0; - sppi[cpus].Reserved1[1].QuadPart = 0; + fill_in_sppi(sppi + cpus, idle, sys, usr); cpus++; } }