+static gauge_t calculate_rate(gauge_t part, gauge_t total, gauge_t *prev_part,
+ gauge_t *prev_total) {
+ if (isnan(*prev_part) || isnan(*prev_total) || (part < *prev_part) ||
+ (total < *prev_total)) {
+ *prev_part = part;
+ *prev_total = total;
+ return NAN;
+ }
+
+ gauge_t num = part - *prev_part;
+ gauge_t denom = total - *prev_total;
+
+ *prev_part = part;
+ *prev_total = total;
+
+ if (num == 0 || denom == 0)
+ return 0;
+
+ return 100.0 * num / denom;
+}
+
+static gauge_t calculate_rate2(gauge_t part1, gauge_t part2, gauge_t *prev1,
+ gauge_t *prev2) {
+ if (isnan(*prev1) || isnan(*prev2) || (part1 < *prev1) || (part2 < *prev2)) {
+ *prev1 = part1;
+ *prev2 = part2;
+ return NAN;
+ }
+
+ gauge_t num = part1 - *prev1;
+ gauge_t denom = part2 - *prev2 + num;
+
+ *prev1 = part1;
+ *prev2 = part2;
+
+ if (num == 0 || denom == 0)
+ return 0;
+
+ return 100.0 * num / denom;
+}
+