summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2015-11-25 20:17:29 +0100
committerGiampaolo Rodola <g.rodola@gmail.com>2015-11-25 20:17:29 +0100
commit8485b4ef130c50a63e79dafe6f77f5e72d4a289a (patch)
treec00f18bde2a074de6d0f622f039264a581e16df3
parent1c20a66a1be79481f31bbcbea6e22b7edf1709c0 (diff)
downloadpsutil-8485b4ef130c50a63e79dafe6f77f5e72d4a289a.tar.gz
#714: [OpenBSD] return virtual cached memory
-rw-r--r--HISTORY.rst8
-rw-r--r--psutil/__init__.py2
-rw-r--r--psutil/arch/bsd/openbsd.c33
3 files changed, 30 insertions, 13 deletions
diff --git a/HISTORY.rst b/HISTORY.rst
index cca4c653..0dd2ebff 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,5 +1,13 @@
Bug tracker at https://github.com/giampaolo/psutil/issues
+3.3.1 - XXXX-XX-XX
+==================
+
+**Bug fixes**
+
+- #714: [OpenBSD] virtual_memory().cached value was always set to 0.
+
+
3.3.0 - 2015-11-25
==================
diff --git a/psutil/__init__.py b/psutil/__init__.py
index 80aa261b..fa89f973 100644
--- a/psutil/__init__.py
+++ b/psutil/__init__.py
@@ -161,7 +161,7 @@ __all__ = [
]
__all__.extend(_psplatform.__extra__all__)
__author__ = "Giampaolo Rodola'"
-__version__ = "3.3.0"
+__version__ = "3.3.1"
version_info = tuple([int(num) for num in __version__.split('.')])
AF_LINK = _psplatform.AF_LINK
_TOTAL_PHYMEM = None
diff --git a/psutil/arch/bsd/openbsd.c b/psutil/arch/bsd/openbsd.c
index d7aa8972..fc1673c3 100644
--- a/psutil/arch/bsd/openbsd.c
+++ b/psutil/arch/bsd/openbsd.c
@@ -19,6 +19,7 @@
#include <sys/sysctl.h>
#include <sys/user.h>
#include <sys/proc.h>
+#include <sys/mount.h> // for VFS_*
#include <sys/swap.h> // for swap_mem
#include <signal.h>
#include <kvm.h>
@@ -321,25 +322,33 @@ error:
PyObject *
psutil_virtual_mem(PyObject *self, PyObject *args) {
- unsigned int total;
- size_t size = sizeof(total);
- struct uvmexp uvmexp;
- int mib[] = {CTL_VM, VM_UVMEXP};
- long pagesize = getpagesize();
+ int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
+ int bcstats_mib[] = {CTL_VFS, VFS_GENERIC, VFS_BCACHESTAT};
+ size_t size;
+ struct uvmexp uvmexp;
+ struct bcachestats bcstats;
+ long pagesize = getpagesize();
+
size = sizeof(uvmexp);
+ if (sysctl(uvmexp_mib, 2, &uvmexp, &size, NULL, 0) < 0) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
- if (sysctl(mib, 2, &uvmexp, &size, NULL, 0) < 0) {
- warn("failed to get vm.uvmexp");
+ // This is how "top" calculates cached memory.
+ size = sizeof(bcstats);
+ if (sysctl(bcstats_mib, 3, &bcstats, &size, NULL, 0) < 0) {
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+
return Py_BuildValue("KKKKKKKK",
- (unsigned long long) uvmexp.npages * pagesize,
- (unsigned long long) uvmexp.free * pagesize,
- (unsigned long long) uvmexp.active * pagesize,
+ (unsigned long long) uvmexp.npages * pagesize,
+ (unsigned long long) uvmexp.free * pagesize,
+ (unsigned long long) uvmexp.active * pagesize,
(unsigned long long) uvmexp.inactive * pagesize,
- (unsigned long long) uvmexp.wired * pagesize,
- (unsigned long long) 0, // cached
+ (unsigned long long) uvmexp.wired * pagesize,
+ (unsigned long long) bcstats.numbufpages * pagesize, // cached
(unsigned long long) 0, // buffers
(unsigned long long) 0 // shared
);