diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2019-11-21 23:15:37 -0800 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2019-11-21 23:15:37 -0800 |
commit | 02a799a21d5e25a074ad968bb4e7ff012fb737c4 (patch) | |
tree | 0ddb848376f9e3333dd5571751b82faa9752a3fe | |
parent | 81796561fc3e485e64f2064043078cdeeab0c780 (diff) | |
download | psutil-shared-mem.tar.gz |
also provide private wset, which is supposed to be different than USSshared-mem
-rw-r--r-- | psutil/_psutil_windows.c | 32 | ||||
-rw-r--r-- | psutil/_pswindows.py | 8 | ||||
-rwxr-xr-x | 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): |