[PATCH 3/4] server: Factor out vm_counters_t.
Zebediah Figura
z.figura12 at gmail.com
Tue Jul 7 18:58:35 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/ntdll/unix/process.c | 19 ++++++-----
server/process.c | 69 +++++++++++++++++++++------------------
server/protocol.def | 13 +++++---
server/trace.c | 12 +++++++
tools/make_requests | 1 +
5 files changed, 70 insertions(+), 44 deletions(-)
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
index 7061d8864db..8c0b97922d2 100644
--- a/dlls/ntdll/unix/process.c
+++ b/dlls/ntdll/unix/process.c
@@ -1057,6 +1057,16 @@ static void fill_VM_COUNTERS( VM_COUNTERS_EX *pvmi )
#endif
+static void vm_counters_from_server( VM_COUNTERS_EX *to, const vm_counters_t *from )
+{
+ to->PeakVirtualSize = from->peak_virtual_size;
+ to->VirtualSize = from->virtual_size;
+ to->PeakWorkingSetSize = from->peak_working_set_size;
+ to->WorkingSetSize = from->working_set_size;
+ to->PagefileUsage = from->pagefile_usage;
+ to->PeakPagefileUsage = from->peak_pagefile_usage;
+}
+
#define UNIMPLEMENTED_INFO_CLASS(c) \
case c: \
FIXME( "(process=%p) Unimplemented information class: " #c "\n", handle); \
@@ -1178,14 +1188,7 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class
{
req->handle = wine_server_obj_handle( handle );
if (!(ret = wine_server_call( req )))
- {
- pvmi.PeakVirtualSize = reply->peak_virtual_size;
- pvmi.VirtualSize = reply->virtual_size;
- pvmi.PeakWorkingSetSize = reply->peak_working_set_size;
- pvmi.WorkingSetSize = reply->working_set_size;
- pvmi.PagefileUsage = reply->pagefile_usage;
- pvmi.PeakPagefileUsage = reply->peak_pagefile_usage;
- }
+ vm_counters_from_server( &pvmi, &reply->counters );
}
SERVER_END_REQ;
if (ret) break;
diff --git a/server/process.c b/server/process.c
index 5e587b28cbe..7d3429d9635 100644
--- a/server/process.c
+++ b/server/process.c
@@ -1086,6 +1086,42 @@ int set_process_debug_flag( struct process *process, int flag )
return write_process_memory( process, process->peb + 2, 1, &data );
}
+void get_vm_counters( vm_counters_t *counters, struct process *process )
+{
+#ifdef linux
+ if (process->unix_pid != -1)
+ {
+ FILE *f;
+ char proc_path[32], line[256];
+ unsigned long value;
+
+ sprintf( proc_path, "/proc/%u/status", process->unix_pid );
+ if ((f = fopen( proc_path, "r" )))
+ {
+ while (fgets( line, sizeof(line), f ))
+ {
+ if (sscanf( line, "VmPeak: %lu", &value ))
+ counters->peak_virtual_size = (mem_size_t)value * 1024;
+ else if (sscanf( line, "VmSize: %lu", &value ))
+ counters->virtual_size = (mem_size_t)value * 1024;
+ else if (sscanf( line, "VmHWM: %lu", &value ))
+ counters->peak_working_set_size = (mem_size_t)value * 1024;
+ else if (sscanf( line, "VmRSS: %lu", &value ))
+ counters->working_set_size = (mem_size_t)value * 1024;
+ else if (sscanf( line, "RssAnon: %lu", &value ))
+ counters->pagefile_usage += (mem_size_t)value * 1024;
+ else if (sscanf( line, "VmSwap: %lu", &value ))
+ counters->pagefile_usage += (mem_size_t)value * 1024;
+ }
+ counters->peak_pagefile_usage = counters->pagefile_usage;
+ fclose( f );
+ }
+ else set_error( STATUS_ACCESS_DENIED );
+ }
+ else set_error( STATUS_ACCESS_DENIED );
+#endif
+}
+
/* create a new process */
DECL_HANDLER(new_process)
{
@@ -1430,38 +1466,7 @@ DECL_HANDLER(get_process_vm_counters)
struct process *process = get_process_from_handle( req->handle, PROCESS_QUERY_LIMITED_INFORMATION );
if (!process) return;
-#ifdef linux
- if (process->unix_pid != -1)
- {
- FILE *f;
- char proc_path[32], line[256];
- unsigned long value;
-
- sprintf( proc_path, "/proc/%u/status", process->unix_pid );
- if ((f = fopen( proc_path, "r" )))
- {
- while (fgets( line, sizeof(line), f ))
- {
- if (sscanf( line, "VmPeak: %lu", &value ))
- reply->peak_virtual_size = (mem_size_t)value * 1024;
- else if (sscanf( line, "VmSize: %lu", &value ))
- reply->virtual_size = (mem_size_t)value * 1024;
- else if (sscanf( line, "VmHWM: %lu", &value ))
- reply->peak_working_set_size = (mem_size_t)value * 1024;
- else if (sscanf( line, "VmRSS: %lu", &value ))
- reply->working_set_size = (mem_size_t)value * 1024;
- else if (sscanf( line, "RssAnon: %lu", &value ))
- reply->pagefile_usage += (mem_size_t)value * 1024;
- else if (sscanf( line, "VmSwap: %lu", &value ))
- reply->pagefile_usage += (mem_size_t)value * 1024;
- }
- reply->peak_pagefile_usage = reply->pagefile_usage;
- fclose( f );
- }
- else set_error( STATUS_ACCESS_DENIED );
- }
- else set_error( STATUS_ACCESS_DENIED );
-#endif
+ get_vm_counters( &reply->counters, process );
release_object( process );
}
diff --git a/server/protocol.def b/server/protocol.def
index 943c1ade1a4..9f5cd3bc79e 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -918,16 +918,21 @@ struct rawinput_device
@END
-/* Retrieve information about a process memory usage */
- at REQ(get_process_vm_counters)
- obj_handle_t handle; /* process handle */
- at REPLY
+typedef struct
+{
mem_size_t peak_virtual_size; /* peak virtual memory in bytes */
mem_size_t virtual_size; /* virtual memory in bytes */
mem_size_t peak_working_set_size; /* peak real memory in bytes */
mem_size_t working_set_size; /* real memory in bytes */
mem_size_t pagefile_usage; /* commit charge in bytes */
mem_size_t peak_pagefile_usage; /* peak commit charge in bytes */
+} vm_counters_t;
+
+/* Retrieve information about a process memory usage */
+ at REQ(get_process_vm_counters)
+ obj_handle_t handle; /* process handle */
+ at REPLY
+ vm_counters_t counters;
@END
diff --git a/server/trace.c b/server/trace.c
index 55d7bd85dd6..8e73af239d2 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -410,6 +410,18 @@ static void dump_hw_input( const char *prefix, const hw_input_t *input )
}
}
+static void dump_vm_counters( const char *prefix, const vm_counters_t *counters )
+{
+ fprintf( stderr, "%s{", prefix );
+ dump_uint64( "peak_virtual_size=", &counters->peak_virtual_size );
+ dump_uint64( ", virtual_size=", &counters->virtual_size );
+ dump_uint64( ", peak_working_set_size=", &counters->peak_working_set_size );
+ dump_uint64( ", working_set_size=", &counters->working_set_size );
+ dump_uint64( ", pagefile_usage=", &counters->pagefile_usage );
+ dump_uint64( ", peak_pagefile_usage=", &counters->peak_pagefile_usage );
+ fputc( '}', stderr );
+}
+
static void dump_luid( const char *prefix, const luid_t *luid )
{
fprintf( stderr, "%s%d.%u", prefix, luid->high_part, luid->low_part );
diff --git a/tools/make_requests b/tools/make_requests
index 60324d07989..354e70866c0 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -54,6 +54,7 @@ my %formats =
"ioctl_code_t" => [ 4, 4, "&dump_ioctl_code" ],
"client_cpu_t" => [ 4, 4, "&dump_client_cpu" ],
"hw_input_t" => [ 32, 8, "&dump_hw_input" ],
+ "vm_counters_t" => [ 48, 8, "&dump_vm_counters" ],
);
my @requests = ();
--
2.27.0
More information about the wine-devel
mailing list