summaryrefslogtreecommitdiff
path: root/psutil/arch/windows/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'psutil/arch/windows/mem.c')
-rw-r--r--psutil/arch/windows/mem.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/psutil/arch/windows/mem.c b/psutil/arch/windows/mem.c
index 18b535e6..24dc15ad 100644
--- a/psutil/arch/windows/mem.c
+++ b/psutil/arch/windows/mem.c
@@ -7,6 +7,7 @@
#include <Python.h>
#include <windows.h>
#include <Psapi.h>
+#include <pdh.h>
#include "../../_psutil_common.h"
@@ -41,3 +42,53 @@ psutil_virtual_mem(PyObject *self, PyObject *args) {
totalSys,
availSys);
}
+
+
+// Return a float representing the percent usage of all paging files on
+// the system.
+PyObject *
+psutil_swap_percent(PyObject *self, PyObject *args) {
+ WCHAR *szCounterPath = L"\\Paging File(_Total)\\% Usage";
+ PDH_STATUS s;
+ HQUERY hQuery;
+ HCOUNTER hCounter;
+ PDH_FMT_COUNTERVALUE counterValue;
+ double percentUsage;
+
+ if ((PdhOpenQueryW(NULL, 0, &hQuery)) != ERROR_SUCCESS) {
+ PyErr_Format(PyExc_RuntimeError, "PdhOpenQueryW failed");
+ return NULL;
+ }
+
+ s = PdhAddEnglishCounterW(hQuery, szCounterPath, 0, &hCounter);
+ if (s != ERROR_SUCCESS) {
+ PdhCloseQuery(hQuery);
+ PyErr_Format(
+ PyExc_RuntimeError,
+ "PdhAddEnglishCounterW failed. Performance counters may be disabled."
+ );
+ return NULL;
+ }
+
+ s = PdhCollectQueryData(hQuery);
+ if (s != ERROR_SUCCESS) {
+ // If swap disabled this will fail.
+ psutil_debug("PdhCollectQueryData failed; assume swap percent is 0");
+ percentUsage = 0;
+ }
+ else {
+ s = PdhGetFormattedCounterValue(
+ (PDH_HCOUNTER)hCounter, PDH_FMT_DOUBLE, 0, &counterValue);
+ if (s != ERROR_SUCCESS) {
+ PdhCloseQuery(hQuery);
+ PyErr_Format(
+ PyExc_RuntimeError, "PdhGetFormattedCounterValue failed");
+ return NULL;
+ }
+ percentUsage = counterValue.doubleValue;
+ }
+
+ PdhRemoveCounter(hCounter);
+ PdhCloseQuery(hQuery);
+ return Py_BuildValue("d", percentUsage);
+}