From 02a799a21d5e25a074ad968bb4e7ff012fb737c4 Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Thu, 21 Nov 2019 23:15:37 -0800 Subject: also provide private wset, which is supposed to be different than USS --- psutil/_psutil_windows.c | 32 +++++++------------------------- psutil/_pswindows.py | 8 +++++--- psutil/tests/test_process.py | 5 +++-- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/psutil/_psutil_windows.c b/psutil/_psutil_windows.c index b8391a7a..20b86f0a 100644 --- a/psutil/_psutil_windows.c +++ b/psutil/_psutil_windows.c @@ -833,8 +833,8 @@ static PyObject * psutil_proc_memory_wset(PyObject *self, PyObject *args) { DWORD pid; HANDLE hProcess; - PSUTIL_PROCESS_WS_COUNTERS wsCounters; PMEMORY_WORKING_SET_INFORMATION wsInfo; + SIZE_T uss, private, shared, shareable = 0; ULONG_PTR i; if (! PyArg_ParseTuple(args, "l", &pid)) @@ -847,42 +847,24 @@ psutil_proc_memory_wset(PyObject *self, PyObject *args) { CloseHandle(hProcess); return NULL; } - memset(&wsCounters, 0, sizeof(PSUTIL_PROCESS_WS_COUNTERS)); for (i = 0; i < wsInfo->NumberOfEntries; i++) { - // This is what ProcessHacker does. - /* - wsCounters.NumberOfPages++; - if (wsInfo->WorkingSetInfo[i].ShareCount > 1) - wsCounters.NumberOfSharedPages++; - if (wsInfo->WorkingSetInfo[i].ShareCount == 0) - wsCounters.NumberOfPrivatePages++; - if (wsInfo->WorkingSetInfo[i].Shared) - wsCounters.NumberOfShareablePages++; - */ - - // This is what we do: count shared pages that only one process - // is using as private (USS). if (!wsInfo->WorkingSetInfo[i].Shared || wsInfo->WorkingSetInfo[i].ShareCount <= 1) { - wsCounters.NumberOfPrivatePages++; + uss++; } - - // shared memory info if (wsInfo->WorkingSetInfo[i].ShareCount > 1) - wsCounters.NumberOfSharedPages++; + shared++; if (wsInfo->WorkingSetInfo[i].Shared) - wsCounters.NumberOfShareablePages++; + shareable++; + if (wsInfo->WorkingSetInfo[i].ShareCount == 0) + private++; } HeapFree(GetProcessHeap(), 0, wsInfo); CloseHandle(hProcess); - return Py_BuildValue( - "III", - wsCounters.NumberOfPrivatePages, - wsCounters.NumberOfSharedPages, - wsCounters.NumberOfShareablePages); + return Py_BuildValue("IIII", uss, private, shared, shareable); } diff --git a/psutil/_pswindows.py b/psutil/_pswindows.py index c5ef7c3b..0b061a8c 100644 --- a/psutil/_pswindows.py +++ b/psutil/_pswindows.py @@ -202,7 +202,8 @@ pmem = namedtuple( 'pagefile', 'peak_pagefile', 'private']) # psutil.Process.memory_full_info() pfullmem = namedtuple('pfullmem', - pmem._fields + ('uss', 'shared', 'shareable')) + pmem._fields + ('uss', 'wset_private', 'wset_shared', + 'wset_shareable')) # psutil.Process.memory_maps(grouped=True) pmmap_grouped = namedtuple('pmmap_grouped', ['path', 'rss']) # psutil.Process.memory_maps(grouped=False) @@ -868,11 +869,12 @@ class Process(object): @wrap_exceptions def memory_full_info(self): basic_mem = self.memory_info() - uss, shared, shareable = cext.proc_memory_wset(self.pid) + uss, private, shared, shareable = cext.proc_memory_wset(self.pid) uss *= getpagesize() + private *= getpagesize() shared *= getpagesize() shareable *= getpagesize() - return pfullmem(*basic_mem + (uss, shared, shareable)) + return pfullmem(*basic_mem + (uss, private, shared, shareable)) def memory_maps(self): try: diff --git a/psutil/tests/test_process.py b/psutil/tests/test_process.py index a92e84ce..c63ee09f 100755 --- a/psutil/tests/test_process.py +++ b/psutil/tests/test_process.py @@ -613,8 +613,9 @@ class TestProcess(unittest.TestCase): self.assertGreaterEqual(mem.pss, 0) self.assertGreaterEqual(mem.swap, 0) if WINDOWS: - self.assertGreaterEqual(mem.shared, 0) - self.assertGreaterEqual(mem.shareable, 0) + self.assertGreaterEqual(mem.wset_private, 0) + self.assertGreaterEqual(mem.wset_shared, 0) + self.assertGreaterEqual(mem.wset_shareable, 0) @unittest.skipIf(not HAS_MEMORY_MAPS, "not supported") def test_memory_maps(self): -- cgit v1.2.1