From 79e3c21c3cca822efedff3092df42f9044da10fe Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 22 May 2020 09:15:45 +0200 Subject: [PATCH] kernel32: Move GetSystemTimes() implementation to kernelbase. Signed-off-by: Alexandre Julliard --- dlls/kernel32/kernel32.spec | 2 +- dlls/kernel32/time.c | 71 --------------------------------- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 57 +++++++++++++++++++++++++- 4 files changed, 58 insertions(+), 74 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index efb892bf1bb..72a09c53c8f 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -835,7 +835,7 @@ @ stdcall GetSystemTimeAdjustment(ptr ptr ptr) @ stdcall -import GetSystemTimeAsFileTime(ptr) @ stdcall -import GetSystemTimePreciseAsFileTime(ptr) -@ stdcall GetSystemTimes(ptr ptr ptr) +@ stdcall -import GetSystemTimes(ptr ptr ptr) @ stdcall -import GetSystemWindowsDirectoryA(ptr long) @ stdcall -import GetSystemWindowsDirectoryW(ptr long) @ stdcall -import GetSystemWow64DirectoryA(ptr long) diff --git a/dlls/kernel32/time.c b/dlls/kernel32/time.c index 5aef53da639..127f341adc0 100644 --- a/dlls/kernel32/time.c +++ b/dlls/kernel32/time.c @@ -223,77 +223,6 @@ BOOL WINAPI FileTimeToDosDateTime( const FILETIME *ft, LPWORD fatdate, return TRUE; } -/********************************************************************* - * GetSystemTimes (KERNEL32.@) - * - * Retrieves system timing information - * - * PARAMS - * lpIdleTime [O] Destination for idle time. - * lpKernelTime [O] Destination for kernel time. - * lpUserTime [O] Destination for user time. - * - * RETURNS - * TRUE if success, FALSE otherwise. - */ -BOOL WINAPI GetSystemTimes(LPFILETIME lpIdleTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime) -{ - LARGE_INTEGER idle_time, kernel_time, user_time; - SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *sppi; - SYSTEM_BASIC_INFORMATION sbi; - ULONG ret_size; - int i; - - TRACE("(%p,%p,%p)\n", lpIdleTime, lpKernelTime, lpUserTime); - - if (!set_ntstatus( NtQuerySystemInformation( SystemBasicInformation, &sbi, sizeof(sbi), &ret_size ))) - return FALSE; - - sppi = HeapAlloc( GetProcessHeap(), 0, - sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * sbi.NumberOfProcessors); - if (!sppi) - { - SetLastError( ERROR_OUTOFMEMORY ); - return FALSE; - } - - if (!set_ntstatus( NtQuerySystemInformation( SystemProcessorPerformanceInformation, sppi, - sizeof(*sppi) * sbi.NumberOfProcessors, &ret_size ))) - { - HeapFree( GetProcessHeap(), 0, sppi ); - return FALSE; - } - - idle_time.QuadPart = 0; - kernel_time.QuadPart = 0; - user_time.QuadPart = 0; - for (i = 0; i < sbi.NumberOfProcessors; i++) - { - idle_time.QuadPart += sppi[i].IdleTime.QuadPart; - kernel_time.QuadPart += sppi[i].KernelTime.QuadPart; - user_time.QuadPart += sppi[i].UserTime.QuadPart; - } - - if (lpIdleTime) - { - lpIdleTime->dwLowDateTime = idle_time.u.LowPart; - lpIdleTime->dwHighDateTime = idle_time.u.HighPart; - } - if (lpKernelTime) - { - lpKernelTime->dwLowDateTime = kernel_time.u.LowPart; - lpKernelTime->dwHighDateTime = kernel_time.u.HighPart; - } - if (lpUserTime) - { - lpUserTime->dwLowDateTime = user_time.u.LowPart; - lpUserTime->dwHighDateTime = user_time.u.HighPart; - } - - HeapFree( GetProcessHeap(), 0, sppi ); - return TRUE; -} - /****************************************************************************** * GetTickCount64 (KERNEL32.@) */ diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 4a6bc5eea4e..15002299695 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -698,7 +698,7 @@ @ stdcall GetSystemTimeAdjustment(ptr ptr ptr) kernel32.GetSystemTimeAdjustment @ stdcall GetSystemTimeAsFileTime(ptr) @ stdcall GetSystemTimePreciseAsFileTime(ptr) -@ stdcall GetSystemTimes(ptr ptr ptr) kernel32.GetSystemTimes +@ stdcall GetSystemTimes(ptr ptr ptr) @ stdcall GetSystemWindowsDirectoryA(ptr long) @ stdcall GetSystemWindowsDirectoryW(ptr long) @ stdcall GetSystemWow64Directory2A(ptr long long) diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index 99706277da2..7ea70202c2f 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -124,10 +124,60 @@ static BOOL get_open_object_attributes( OBJECT_ATTRIBUTES *attr, UNICODE_STRING /*********************************************************************** - * Waits + * Time functions ***********************************************************************/ +/********************************************************************* + * GetSystemTimes (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH GetSystemTimes( FILETIME *idle, FILETIME *kernel, FILETIME *user ) +{ + LARGE_INTEGER idle_time, kernel_time, user_time; + SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *info; + ULONG ret_size; + DWORD i, cpus = NtCurrentTeb()->Peb->NumberOfProcessors; + + if (!(info = HeapAlloc( GetProcessHeap(), 0, sizeof(*info) * cpus ))) + { + SetLastError( ERROR_OUTOFMEMORY ); + return FALSE; + } + if (!set_ntstatus( NtQuerySystemInformation( SystemProcessorPerformanceInformation, info, + sizeof(*info) * cpus, &ret_size ))) + { + HeapFree( GetProcessHeap(), 0, info ); + return FALSE; + } + idle_time.QuadPart = 0; + kernel_time.QuadPart = 0; + user_time.QuadPart = 0; + for (i = 0; i < cpus; i++) + { + idle_time.QuadPart += info[i].IdleTime.QuadPart; + kernel_time.QuadPart += info[i].KernelTime.QuadPart; + user_time.QuadPart += info[i].UserTime.QuadPart; + } + if (idle) + { + idle->dwLowDateTime = idle_time.u.LowPart; + idle->dwHighDateTime = idle_time.u.HighPart; + } + if (kernel) + { + kernel->dwLowDateTime = kernel_time.u.LowPart; + kernel->dwHighDateTime = kernel_time.u.HighPart; + } + if (user) + { + user->dwLowDateTime = user_time.u.LowPart; + user->dwHighDateTime = user_time.u.HighPart; + } + HeapFree( GetProcessHeap(), 0, info ); + return TRUE; +} + + /****************************************************************************** * GetTickCount (kernelbase.@) */ @@ -156,6 +206,11 @@ ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void) } +/*********************************************************************** + * Waits + ***********************************************************************/ + + static HANDLE normalize_handle_if_console( HANDLE handle ) { static HANDLE wait_event;