diff options
author | Denis Krienbühl <denis@href.ch> | 2018-03-29 20:12:10 +0200 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2018-03-29 14:12:10 -0400 |
commit | a4c07e9da0f7a3a92b27c856eec09954ccc824ca (patch) | |
tree | 429c2abe56e35217f56e9b6b7d6519a063f7af27 | |
parent | bf9f8ff572d946b069660278cfe15054b05804e1 (diff) | |
download | psutil-a4c07e9da0f7a3a92b27c856eec09954ccc824ca.tar.gz |
Fixes swap_memory not returning bytes on FreeBSD (#1260)
-rw-r--r-- | psutil/arch/freebsd/specific.c | 10 | ||||
-rwxr-xr-x | psutil/tests/test_bsd.py | 34 |
2 files changed, 40 insertions, 4 deletions
diff --git a/psutil/arch/freebsd/specific.c b/psutil/arch/freebsd/specific.c index 2c8944dd..f6d1a67e 100644 --- a/psutil/arch/freebsd/specific.c +++ b/psutil/arch/freebsd/specific.c @@ -516,10 +516,12 @@ 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 + 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 - kvmsw[0].ksw_used * pagesize, // free swapin + swapout, // swap in nodein + nodeout); // swap out diff --git a/psutil/tests/test_bsd.py b/psutil/tests/test_bsd.py index d3868ada..63cae66a 100755 --- a/psutil/tests/test_bsd.py +++ b/psutil/tests/test_bsd.py @@ -344,6 +344,40 @@ class FreeBSDSpecificTestCase(unittest.TestCase): # self.assertAlmostEqual(psutil.cpu_stats().traps, # sysctl('vm.stats.sys.v_trap'), delta=1000) + # --- swap memory + @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 + + 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): |