[Xfce4-commits] [panel-plugins/xfce4-hardware-monitor-plugin] 18/29: Update unit reporting to reflect the fact its no longer always seconds, make all DiskStats durations precise
noreply at xfce.org
noreply at xfce.org
Mon Dec 18 12:45:49 CET 2017
This is an automated email from the git hooks/post-receive script.
o m e g a p h i l p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository panel-plugins/xfce4-hardware-monitor-plugin.
commit 7843210061951a7fb0a3d2beb8c59dd9cbd7231f
Author: OmegaPhil <OmegaPhil at startmail.com>
Date: Sat Dec 2 14:43:00 2017 +0000
Update unit reporting to reflect the fact its no longer always seconds, make all DiskStats durations precise
---
src/monitor-impls.cpp | 137 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 96 insertions(+), 41 deletions(-)
diff --git a/src/monitor-impls.cpp b/src/monitor-impls.cpp
index 398e869..49c6a9a 100644
--- a/src/monitor-impls.cpp
+++ b/src/monitor-impls.cpp
@@ -411,39 +411,89 @@ Precision decimal_digits(double val, int n)
return p;
}
-Glib::ustring format_bytes_per_second(long duration_ms, double bytes,
- bool compact)
+Glib::ustring format_duration_to_string(long duration)
+{
+ /* This is intended to summarise a user-customisable time period for long
+ * monitor descriptions, breaking millisecond duration into hours, minutes,
+ * seconds */
+ int hours = 0, minutes = 0, seconds = 0;
+ Glib::ustring duration_string("");
+
+ if (duration >= 3600000)
+ {
+ hours = duration / 3600000;
+ duration -= (hours * 3600000);
+ duration_string += String::ucompose(_("%1h"), hours);
+ }
+ if (duration >= 60000)
+ {
+ minutes = duration / 60000;
+ duration -= (minutes * 60000);
+ duration_string += String::ucompose(_("%1m"), minutes);
+ }
+ if (duration >= 1000)
+ {
+ seconds = duration / 1000;
+ duration_string += String::ucompose(_("%1s"), seconds);
+ }
+
+ /* When a single unit of a single time period is returned, don't return the
+ * number */
+ if (hours + minutes + seconds == 1)
+ {
+ if (hours == 1)
+ return "h";
+ else if (minutes == 1)
+ return "m";
+ else
+ return "s";
+ }
+ else
+ return duration_string;
+}
+
+Glib::ustring format_bytes_per_duration(long duration, int expected_duration,
+ double bytes, bool compact)
{
Glib::ustring format;
- // 1000 ms = 1 s
- double val = bytes / duration_ms * 1000;
+ /* Values are in milliseconds - this creates an average rate over the actual
+ * time duration measured, scaled to the precise desired duration - otherwise
+ * the timer tick is slightly inaccurate (so 1ms late for a second etc) */
+ double val = bytes / duration * expected_duration;
// Debug code
- //std::cerr << String::ucompose("format_bytes_per_second formatting %1\n", val);
+ //std::cerr << String::ucompose("format_bytes_per_duration formatting %1\n", val);
if (val <= 0) // fix weird problem with negative values
val = 0;
- if (val >= 1024 * 1024 * 1024) {
+ if (val >= 1024 * 1024 * 1024)
+ {
val /= 1024 * 1024 * 1024;
- format = compact ? _("%1G") : _("%1 GB/s");
- return String::ucompose(format, decimal_digits(val, 3), val);
+ format = compact ? _("%1G%2") : "%1 GB/%2";
+ return String::ucompose(format, decimal_digits(val, 3), val,
+ compact ? "" : format_duration_to_string(expected_duration));
}
- else if (val >= 1024 * 1024) {
+ else if (val >= 1024 * 1024)
+ {
val /= 1024 * 1024;
- format = compact ? _("%1M") : _("%1 MB/s");
- return String::ucompose(format, decimal_digits(val, 3), val);
+ format = compact ? _("%1M%2") : "%1 MB/%2";
+ return String::ucompose(format, decimal_digits(val, 3), val,
+ compact ? "" : format_duration_to_string(expected_duration));
}
- else if (val >= 1024) {
+ else if (val >= 1024)
+ {
val /= 1024;
- format = compact ? _("%1K") : _("%1 KB/s");
- return String::ucompose(format, decimal_digits(val, 3), val);
+ format = compact ? _("%1K%2") : "%1 KB/%2";
+ return String::ucompose(format, decimal_digits(val, 3), val,
+ compact ? "" : format_duration_to_string(expected_duration));
}
else
{
- format = compact ? _("%1B") : _("%1 B/s");
- return String::ucompose(format, decimal_digits(val, 3), val);
+ format = compact ? _("%1B%2") : "%1 B/%2";
+ return String::ucompose(format, decimal_digits(val, 3), val,
+ compact ? "" : format_duration_to_string(expected_duration));
}
}
@@ -1070,30 +1120,15 @@ double DiskStatsMonitor::do_measure()
double val;
if (convert_to_rate())
{
- /* Sectors read and written are now converted to bytes based off the
- * relevant device's sector size, allowing for the much more interesting
- * data rate to be reported on
- * Conversion to bytes is left to here so as not to call fsuage on all
- * volumes pointlessly
- * Time of call used to get at a precise data rate, like the network load
- * monitor does */
+ /* Sectors read and written are now converted to bytes based off a fixed
+ * sector size (see SECTOR_SIZE static initialiser notes), allowing for the
+ * much more interesting data rate to be reported on */
int multiplication_factor;
if (stat_to_monitor == Stat::num_bytes_read ||
stat_to_monitor == Stat::num_bytes_written)
{
multiplication_factor = SECTOR_SIZE;
- /* Calculate time difference in msecs between last sample and current
- * sample */
- struct timeval tv;
- if (gettimeofday(&tv, 0) == 0) {
- time_difference =
- (tv.tv_sec - time_stamp_secs) * 1000 +
- (tv.tv_usec - time_stamp_usecs) / 1000;
- time_stamp_secs = tv.tv_sec;
- time_stamp_usecs = tv.tv_usec;
- }
-
// Debug code
/*std::cerr << Glib::ustring::compose("Device '%1' has filesystem block size"
" %2, measurement time difference %3\n",
@@ -1108,10 +1143,22 @@ double DiskStatsMonitor::do_measure()
if (previous_value == -1)
previous_value = it->second[stat_to_monitor] * multiplication_factor;
- // Returning desired stat
val = (it->second[stat_to_monitor] * multiplication_factor) -
previous_value;
previous_value = it->second[stat_to_monitor] * multiplication_factor;
+
+ /* Calculate time difference in msecs between last sample and current
+ * sample
+ * Time of call used to get at a precise data rate, like the network load
+ * monitor does - every rate measurement should be precise */
+ struct timeval tv;
+ if (gettimeofday(&tv, 0) == 0) {
+ time_difference =
+ (tv.tv_sec - time_stamp_secs) * 1000 +
+ (tv.tv_usec - time_stamp_usecs) / 1000;
+ time_stamp_secs = tv.tv_sec;
+ time_stamp_usecs = tv.tv_usec;
+ }
}
else
{
@@ -1145,16 +1192,22 @@ bool DiskStatsMonitor::fixed_max()
Glib::ustring DiskStatsMonitor::format_value(double val, bool compact)
{
- /* Currently measurement is every second
- * For read and write data rates, return in appropriate scaled units */
+ // For read and write data rates, return in appropriate scaled units
if (stat_to_monitor == Stat::num_bytes_read ||
stat_to_monitor == Stat::num_bytes_written)
{
- return format_bytes_per_second(time_difference, val, compact);
+ return format_bytes_per_duration(time_difference, update_interval_priv, val,
+ compact);
}
else
{
- Glib::ustring unit = (convert_to_rate() && !compact) ? "/s" : "";
+ /* Remember users can define the monitoring interval, so the time unit must
+ * be calculated specially */
+ Glib::ustring unit =
+ (convert_to_rate() && !compact) ?
+ Glib::ustring::compose("/%1",
+ format_duration_to_string(update_interval_priv))
+ : "";
return Glib::ustring::compose("%1%2", val, unit);
}
}
@@ -1731,7 +1784,8 @@ bool NetworkLoadMonitor::fixed_max()
Glib::ustring NetworkLoadMonitor::format_value(double val, bool compact)
{
- return format_bytes_per_second(time_difference, val, compact);
+ return format_bytes_per_duration(time_difference, update_interval_priv, val,
+ compact);
}
Glib::ustring NetworkLoadMonitor::get_default_interface_name(InterfaceType type)
@@ -2477,7 +2531,8 @@ double GenericMonitor::do_measure()
if (!fixed_max_priv)
{
/* Note - max_value is no longer used to determine the graph max for
- * Curves - the actual maxima stored in the ValueHistories are used */
+ * Curves and Columns - the actual maxima stored in the ValueHistories are
+ * used */
if (val != 0) // Reduce scale gradually
max_value = guint64(max_value * max_decay);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list