summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Widdis <widdis@gmail.com>2022-10-20 16:11:21 -0700
committerGitHub <noreply@github.com>2022-10-21 01:11:21 +0200
commitcd8827d065d63114060aae69f36b447006c5a70f (patch)
tree643103d217b252fa0282acf1a03c119746fe1a30
parent614e91158ced7a65aabbe7244d52de1cebfc494b (diff)
downloadpsutil-cd8827d065d63114060aae69f36b447006c5a70f.tar.gz
Use system-level values for Windows virtual memory (#2077)
* Use system-level values for Windows virtual memory Submitting this as a draft PR as I believe it will address #2074. I do not have either a C or Python development environment to test these changes, so they are provided in the hopes someone else can test and confirm they fix the issue. There's probably some room to simplify the code with temporary variables to reduce redundancy. For background, I have implemented precisely this logic in my own (Java-based) project [here](https://github.com/oshi/oshi/blob/3bb9eafbe2062edad4108b7b12501b1f9be27361/oshi-core/src/main/java/oshi/hardware/platform/windows/WindowsVirtualMemory.java#L110-L118) and [here](https://github.com/oshi/oshi/blob/3bb9eafbe2062edad4108b7b12501b1f9be27361/oshi-core/src/main/java/oshi/hardware/platform/windows/WindowsGlobalMemory.java#L253-L263) following a detailed investigation in https://github.com/oshi/oshi/issues/1182 Signed-off-by: Daniel Widdis <widdis@gmail.com> * Formatting, credits, change log Signed-off-by: Daniel Widdis <widdis@gmail.com> Signed-off-by: Daniel Widdis <widdis@gmail.com>
-rw-r--r--CREDITS4
-rw-r--r--HISTORY.rst10
-rw-r--r--psutil/_psutil_windows.c25
-rw-r--r--psutil/_pswindows.py6
4 files changed, 32 insertions, 13 deletions
diff --git a/CREDITS b/CREDITS
index 6f1b6e5b..29298ca3 100644
--- a/CREDITS
+++ b/CREDITS
@@ -801,3 +801,7 @@ I: 2135
N: Daniel Li
I: 2150
+
+N: Daniel Widdis
+W: https://github.com/dbwiddis
+I: 2077
diff --git a/HISTORY.rst b/HISTORY.rst
index e9833990..f0d0905d 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,5 +1,15 @@
*Bug tracker at https://github.com/giampaolo/psutil/issues*
+5.9.4 (IN DEVELOPMENT)
+======================
+
+XXXX-XX-XX
+
+**Bug fixes**
+
+- 2077_, [Windows]: Use system-level values for `virtual_memory()`. (patch by
+ Daniel Widdis)
+
5.9.3
=====
diff --git a/psutil/_psutil_windows.c b/psutil/_psutil_windows.c
index 83da3a26..6e51c449 100644
--- a/psutil/_psutil_windows.c
+++ b/psutil/_psutil_windows.c
@@ -610,20 +610,25 @@ psutil_proc_memory_uss(PyObject *self, PyObject *args) {
*/
static PyObject *
psutil_virtual_mem(PyObject *self, PyObject *args) {
- MEMORYSTATUSEX memInfo;
- memInfo.dwLength = sizeof(MEMORYSTATUSEX);
+ unsigned long long totalPhys, availPhys, totalSys, availSys, pageSize;
+ PERFORMANCE_INFORMATION perfInfo;
- if (! GlobalMemoryStatusEx(&memInfo)) {
+ if (! GetPerformanceInfo(&perfInfo, sizeof(PERFORMANCE_INFORMATION))) {
PyErr_SetFromWindowsErr(0);
return NULL;
}
- return Py_BuildValue("(LLLLLL)",
- memInfo.ullTotalPhys, // total
- memInfo.ullAvailPhys, // avail
- memInfo.ullTotalPageFile, // total page file
- memInfo.ullAvailPageFile, // avail page file
- memInfo.ullTotalVirtual, // total virtual
- memInfo.ullAvailVirtual); // avail virtual
+ // values are size_t, widen (if needed) to long long
+ pageSize = perfInfo.PageSize;
+ totalPhys = perfInfo.PhysicalTotal * pageSize;
+ availPhys = perfInfo.PhysicalAvailable * pageSize;
+ totalSys = perfInfo.CommitLimit * pageSize;
+ availSys = totalSys - perfInfo.CommitTotal * pageSize;
+ return Py_BuildValue(
+ "(LLLL)",
+ totalPhys,
+ availPhys,
+ totalSys,
+ availSys);
}
diff --git a/psutil/_pswindows.py b/psutil/_pswindows.py
index 7d882b77..b546f15d 100644
--- a/psutil/_pswindows.py
+++ b/psutil/_pswindows.py
@@ -229,7 +229,7 @@ def getpagesize():
def virtual_memory():
"""System virtual memory as a namedtuple."""
mem = cext.virtual_mem()
- totphys, availphys, totpagef, availpagef, totvirt, freevirt = mem
+ totphys, availphys, totsys, availsys = mem
#
total = totphys
avail = availphys
@@ -248,8 +248,8 @@ def swap_memory():
total_system = mem[2]
free_system = mem[3]
- # Despite the name PageFile refers to total system memory here
- # thus physical memory values need to be subtracted to get swap values
+ # system memory (commit total/limit) is the sum of physical and swap
+ # thus physical memory values need to be substracted to get swap values
total = total_system - total_phys
free = min(total, free_system - free_phys)
used = total - free