diff --git a/psutil/__init__.py b/psutil/__init__.py index 169a5e8bd..b94c70ddd 100644 --- a/psutil/__init__.py +++ b/psutil/__init__.py @@ -1799,12 +1799,13 @@ def disk_io_counters(perdisk=False): rawdict = _psplatform.disk_io_counters() if not rawdict: raise RuntimeError("couldn't find any physical disk") + nt = getattr(_psplatform, 'sdiskio', _common.sdiskio) if perdisk: for disk, fields in rawdict.items(): - rawdict[disk] = _common.sdiskio(*fields) + rawdict[disk] = nt(*fields) return rawdict else: - return _common.sdiskio(*[sum(x) for x in zip(*rawdict.values())]) + return nt(*[sum(x) for x in zip(*rawdict.values())]) # ===================================================================== diff --git a/psutil/_psbsd.py b/psutil/_psbsd.py index 4806161bd..0b51cd77e 100644 --- a/psutil/_psbsd.py +++ b/psutil/_psbsd.py @@ -103,6 +103,10 @@ 'pmmap_grouped', 'path rss, private, ref_count, shadow_count') pmmap_ext = namedtuple( 'pmmap_ext', 'addr, perms path rss, private, ref_count, shadow_count') +sdiskio = namedtuple('sdiskio', ['read_count', 'write_count', + 'read_bytes', 'write_bytes', + 'read_time', 'write_time', + 'busy_time']) # set later from __init__.py NoSuchProcess = None diff --git a/psutil/arch/bsd/freebsd.c b/psutil/arch/bsd/freebsd.c index 36700092f..f25feba69 100644 --- a/psutil/arch/bsd/freebsd.c +++ b/psutil/arch/bsd/freebsd.c @@ -759,13 +759,14 @@ psutil_disk_io_counters(PyObject *self, PyObject *args) { current.unit_number); py_disk_info = Py_BuildValue( - "(KKKKLL)", + "(KKKKLLL)", current.operations[DEVSTAT_READ], // no reads current.operations[DEVSTAT_WRITE], // no writes current.bytes[DEVSTAT_READ], // bytes read current.bytes[DEVSTAT_WRITE], // bytes written (long long) PSUTIL_BT2MSEC(current.duration[DEVSTAT_READ]), // r time - (long long) PSUTIL_BT2MSEC(current.duration[DEVSTAT_WRITE]) // w time + (long long) PSUTIL_BT2MSEC(current.duration[DEVSTAT_WRITE]), // w time + (long long) PSUTIL_BT2MSEC(current.busy_time) // busy time ); // finished transactions if (!py_disk_info) goto error;