You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Rebase against 1d9a3f6d12322891a2af4aadd66a92ea66479233.
This commit is contained in:
@@ -1,46 +1,37 @@
|
||||
From 8bf339727f8c444f72a9b0c26d08a80f227e6b9a Mon Sep 17 00:00:00 2001
|
||||
From 5cf696c2cb00fd040ddba99ac291806e5ce3c9bf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sun, 19 Feb 2017 05:38:40 +0100
|
||||
Subject: [PATCH] kernel32: Make K32GetPerformanceInfo faster.
|
||||
|
||||
---
|
||||
dlls/kernel32/cpu.c | 68 +++++++++++++++++----------------------------
|
||||
server/process.c | 18 ++++++++++++
|
||||
server/protocol.def | 8 ++++++
|
||||
3 files changed, 51 insertions(+), 43 deletions(-)
|
||||
dlls/kernel32/cpu.c | 32 ++++++++------------------------
|
||||
server/process.c | 18 ++++++++++++++++++
|
||||
server/protocol.def | 8 ++++++++
|
||||
3 files changed, 34 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
|
||||
index 9445d0bc056..6e198badb66 100644
|
||||
index 7668a10ea..96180bed4 100644
|
||||
--- a/dlls/kernel32/cpu.c
|
||||
+++ b/dlls/kernel32/cpu.c
|
||||
@@ -209,14 +209,8 @@ BOOL WINAPI IsProcessorFeaturePresent ( DWORD feature )
|
||||
*/
|
||||
BOOL WINAPI K32GetPerformanceInfo(PPERFORMANCE_INFORMATION info, DWORD size)
|
||||
@@ -211,7 +211,6 @@ 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 performance;
|
||||
+ SYSTEM_BASIC_INFORMATION basic;
|
||||
SYSTEM_PERFORMANCE_INFORMATION perf;
|
||||
SYSTEM_BASIC_INFORMATION basic;
|
||||
- SYSTEM_PROCESS_INFORMATION *process, *spi;
|
||||
DWORD info_size;
|
||||
NTSTATUS status;
|
||||
|
||||
TRACE( "(%p, %d)\n", info, size );
|
||||
@@ -230,53 +224,41 @@ BOOL WINAPI K32GetPerformanceInfo(PPERFORMANCE_INFORMATION info, DWORD size)
|
||||
memset( info, 0, sizeof(*info) );
|
||||
info->cb = sizeof(*info);
|
||||
@@ -240,34 +239,19 @@ BOOL WINAPI K32GetPerformanceInfo(PPERFORMANCE_INFORMATION info, DWORD size)
|
||||
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 (;;)
|
||||
+ SERVER_START_REQ( get_system_info )
|
||||
{
|
||||
- sysinfo = HeapAlloc( GetProcessHeap(), 0, max(process_info_size, sizeof(*sysinfo)) );
|
||||
- if (!sysinfo)
|
||||
- process = HeapAlloc( GetProcessHeap(), 0, info_size );
|
||||
- if (!process)
|
||||
+ status = wine_server_call( req );
|
||||
+ if (!status)
|
||||
{
|
||||
@@ -50,68 +41,34 @@ index 9445d0bc056..6e198badb66 100644
|
||||
+ info->HandleCount = reply->handles;
|
||||
+ info->ThreadCount = reply->threads;
|
||||
}
|
||||
- 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))
|
||||
}
|
||||
+ SERVER_END_REQ;
|
||||
|
||||
- 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;
|
||||
}
|
||||
+ SERVER_END_REQ;
|
||||
+
|
||||
- spi = (SYSTEM_PROCESS_INFORMATION *)((char *)spi + spi->NextEntryOffset);
|
||||
- }
|
||||
- HeapFree( GetProcessHeap(), 0, process );
|
||||
+ if (status) goto err;
|
||||
|
||||
/* fields from SYSTEM_PERFORMANCE_INFORMATION */
|
||||
- status = NtQuerySystemInformation( SystemPerformanceInformation, &sysinfo->performance,
|
||||
- sizeof(sysinfo->performance), NULL );
|
||||
+ status = NtQuerySystemInformation( SystemPerformanceInformation, &performance,
|
||||
+ sizeof(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;
|
||||
+ info->CommitTotal = performance.TotalCommittedPages;
|
||||
+ info->CommitLimit = performance.TotalCommitLimit;
|
||||
+ info->CommitPeak = performance.PeakCommitment;
|
||||
+ info->PhysicalAvailable = performance.AvailablePages;
|
||||
+ info->KernelTotal = performance.PagedPoolUsage +
|
||||
+ performance.NonPagedPoolUsage;
|
||||
+ info->KernelPaged = performance.PagedPoolUsage;
|
||||
+ info->KernelNonpaged = performance.NonPagedPoolUsage;
|
||||
|
||||
/* fields from SYSTEM_BASIC_INFORMATION */
|
||||
- status = NtQuerySystemInformation( SystemBasicInformation, &sysinfo->basic,
|
||||
- sizeof(sysinfo->basic), NULL );
|
||||
+ status = NtQuerySystemInformation( SystemBasicInformation, &basic,
|
||||
+ sizeof(basic), NULL );
|
||||
if (status) goto err;
|
||||
- info->PhysicalTotal = sysinfo->basic.MmNumberOfPhysicalPages;
|
||||
- info->PageSize = sysinfo->basic.PageSize;
|
||||
+ info->PhysicalTotal = basic.MmNumberOfPhysicalPages;
|
||||
+ info->PageSize = basic.PageSize;
|
||||
return TRUE;
|
||||
|
||||
err:
|
||||
- HeapFree( GetProcessHeap(), 0, sysinfo );
|
||||
if (status)
|
||||
{
|
||||
SetLastError( RtlNtStatusToDosError( status ) );
|
||||
diff --git a/server/process.c b/server/process.c
|
||||
index 6690b9d2f26..f0b44a8c6f4 100644
|
||||
index beaa68603..2dacc4d5c 100644
|
||||
--- a/server/process.c
|
||||
+++ b/server/process.c
|
||||
@@ -1852,3 +1852,21 @@ DECL_HANDLER(resume_process)
|
||||
@@ -1799,3 +1799,21 @@ DECL_HANDLER(resume_process)
|
||||
release_object( process );
|
||||
}
|
||||
}
|
||||
@@ -134,13 +91,13 @@ index 6690b9d2f26..f0b44a8c6f4 100644
|
||||
+ }
|
||||
+}
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index dc5186c877b..3ed38245d4a 100644
|
||||
index e450388c1..1c1459f3c 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -4042,3 +4042,11 @@ enum esync_type
|
||||
ESYNC_MANUAL_SERVER,
|
||||
ESYNC_QUEUE,
|
||||
};
|
||||
@@ -3946,3 +3946,11 @@ struct handle_info
|
||||
@REQ(resume_process)
|
||||
obj_handle_t handle; /* process handle */
|
||||
@END
|
||||
+
|
||||
+/* Return system information values */
|
||||
+@REQ(get_system_info)
|
||||
@@ -150,5 +107,5 @@ index dc5186c877b..3ed38245d4a 100644
|
||||
+ unsigned int handles; /* number of handles */
|
||||
+@END
|
||||
--
|
||||
2.20.1
|
||||
2.21.0
|
||||
|
||||
|
Reference in New Issue
Block a user