From 0c1908832b50886cd1fa4ea296aa2570625bfa15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Mon, 2 Nov 2020 14:46:42 +0100 Subject: Handle data wraparounds in IO Meters If the current data is smaller than the previous one, either by a retrieve error or a device removal or a original data wraparound, sanitize the value to zero. Fixes: #299 --- DiskIOMeter.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'DiskIOMeter.c') diff --git a/DiskIOMeter.c b/DiskIOMeter.c index 21696a33..e2d02524 100644 --- a/DiskIOMeter.c +++ b/DiskIOMeter.c @@ -53,14 +53,25 @@ static void DiskIOMeter_updateValues(Meter* this, char* buffer, int len) { return; } - cached_read_diff = (data.totalBytesRead - cached_read_total) / 1024; /* Meter_humanUnit() expects unit in kilo */ + if (data.totalBytesRead > cached_read_total) { + cached_read_diff = (data.totalBytesRead - cached_read_total) / 1024; /* Meter_humanUnit() expects unit in kilo */ + } else { + cached_read_diff = 0; + } cached_read_total = data.totalBytesRead; - cached_write_diff = (data.totalBytesWritten - cached_write_total) / 1024; /* Meter_humanUnit() expects unit in kilo */ + if (data.totalBytesWritten > cached_write_total) { + cached_write_diff = (data.totalBytesWritten - cached_write_total) / 1024; /* Meter_humanUnit() expects unit in kilo */ + } else { + cached_write_diff = 0; + } cached_write_total = data.totalBytesWritten; - cached_utilisation_diff = 100 * (double)(data.totalMsTimeSpend - cached_msTimeSpend_total) / passedTimeInMs; - + if (data.totalMsTimeSpend > cached_msTimeSpend_total) { + cached_utilisation_diff = 100 * (double)(data.totalMsTimeSpend - cached_msTimeSpend_total) / passedTimeInMs; + } else { + cached_utilisation_diff = 0.0; + } cached_msTimeSpend_total = data.totalMsTimeSpend; } -- cgit v1.2.3