summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2018-03-29 20:30:56 +0200
committerGiampaolo Rodola <g.rodola@gmail.com>2018-03-29 20:30:56 +0200
commit8b609e4ad7bfbb8db6fb1f9281b3ddcbbda4be07 (patch)
treefe5d2f86ee14f7901b9ec8d4a9973c49b426b302
parentb748ec24b4067f63536b3dec9fa9ab0f3c0c2508 (diff)
parent904252e99a9d3217eda01159ab83e9384db54590 (diff)
downloadpsutil-8b609e4ad7bfbb8db6fb1f9281b3ddcbbda4be07.tar.gz
Merge branch 'master' into 771-win-cpu-count
-rw-r--r--CREDITS4
-rw-r--r--HISTORY.rst2
-rw-r--r--psutil/arch/freebsd/specific.c17
-rwxr-xr-xpsutil/tests/test_bsd.py30
4 files changed, 47 insertions, 6 deletions
diff --git a/CREDITS b/CREDITS
index ae384a53..41061cdf 100644
--- a/CREDITS
+++ b/CREDITS
@@ -531,3 +531,7 @@ I: 1193, 1194
N: Maxime Mouial
W: https://github.com/hush-hush
I: 1239
+
+N: Denis Krienbühl
+W: https://github.com/href
+I: 1260
diff --git a/HISTORY.rst b/HISTORY.rst
index d0bb4b0a..65cad58e 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -35,6 +35,8 @@ XXXX-XX-XX
- 1240_: [Windows] cpu_times() float loses accuracy in a long running system.
(patch by stswandering)
- 1245_: [Linux] sensors_temperatures() may fail with IOError "no such file".
+- 1255_: [FreeBSD] swap_memory() stats were erroneously represented in KB.
+ (patch by Denis Krienbühl)
5.4.3
=====
diff --git a/psutil/arch/freebsd/specific.c b/psutil/arch/freebsd/specific.c
index 2c8944dd..cf0b7df2 100644
--- a/psutil/arch/freebsd/specific.c
+++ b/psutil/arch/freebsd/specific.c
@@ -516,12 +516,17 @@ psutil_swap_mem(PyObject *self, PyObject *args) {
if (sysctlbyname("vm.stats.vm.v_vnodeout", &nodeout, &size, NULL, 0) == -1)
goto error;
- return Py_BuildValue("(iiiII)",
- kvmsw[0].ksw_total, // total
- kvmsw[0].ksw_used, // used
- kvmsw[0].ksw_total - kvmsw[0].ksw_used, // free
- swapin + swapout, // swap in
- nodein + nodeout); // swap out
+ int pagesize = getpagesize();
+
+ return Py_BuildValue(
+ "(KKKII)",
+ (unsigned long long)kvmsw[0].ksw_total * pagesize, // total
+ (unsigned long long)kvmsw[0].ksw_used * pagesize, // used
+ (unsigned long long)kvmsw[0].ksw_total * pagesize - // free
+ kvmsw[0].ksw_used * pagesize,
+ swapin + swapout, // swap in
+ nodein + nodeout // swap out
+ );
error:
return PyErr_SetFromErrno(PyExc_OSError);
diff --git a/psutil/tests/test_bsd.py b/psutil/tests/test_bsd.py
index d3868ada..7846c1ca 100755
--- a/psutil/tests/test_bsd.py
+++ b/psutil/tests/test_bsd.py
@@ -159,6 +159,19 @@ class FreeBSDSpecificTestCase(unittest.TestCase):
def tearDownClass(cls):
reap_children()
+ @staticmethod
+ def parse_swapinfo():
+ # the last line is always the total
+ output = sh("swapinfo -k").splitlines()[-1]
+ parts = re.split(r'\s+', output)
+
+ if not parts:
+ raise ValueError("Can't parse swapinfo: %s" % output)
+
+ # the size is in 1k units, so multiply by 1024
+ total, used, free = (int(p) * 1024 for p in parts[1:4])
+ return total, used, free
+
@retry_before_failing()
def test_proc_memory_maps(self):
out = sh('procstat -v %s' % self.pid)
@@ -344,6 +357,23 @@ class FreeBSDSpecificTestCase(unittest.TestCase):
# self.assertAlmostEqual(psutil.cpu_stats().traps,
# sysctl('vm.stats.sys.v_trap'), delta=1000)
+ # --- swap memory
+
+ def test_swapmem_free(self):
+ total, used, free = self.parse_swapinfo()
+ self.assertAlmostEqual(
+ psutil.swap_memory().free, free, delta=MEMORY_TOLERANCE)
+
+ def test_swapmem_used(self):
+ total, used, free = self.parse_swapinfo()
+ self.assertAlmostEqual(
+ psutil.swap_memory().used, used, delta=MEMORY_TOLERANCE)
+
+ def test_swapmem_total(self):
+ total, used, free = self.parse_swapinfo()
+ self.assertAlmostEqual(
+ psutil.swap_memory().total, total, delta=MEMORY_TOLERANCE)
+
# --- others
def test_boot_time(self):