aboutsummaryrefslogtreecommitdiffstats
path: root/avg.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--avg.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/avg.c b/avg.c
index 4078c50..f24b174 100644
--- a/avg.c
+++ b/avg.c
@@ -5,16 +5,11 @@
/* TODO deal with machine and process suspension */
-static struct timespec write_average_begin_times[5];
-static off_t write_average_amounts[ELEMSOF(write_average_begin_times)] = {0};
-static int write_average_i = 0;
-
-
static int
-was_write_average_overrun(int i, const struct timespec *now, int seconds)
+was_write_average_overrun(int i, int seconds, const struct status *s)
{
struct timespec diff;
- libsimple_difftimespec(&diff, now, &write_average_begin_times[i]);
+ libsimple_difftimespec(&diff, &s->now, &s->write_average_begin_times[i]);
if (diff.tv_sec >= seconds)
return 1;
if (diff.tv_sec == seconds - 1 && diff.tv_nsec >= DECISECONDS(9))
@@ -24,48 +19,48 @@ was_write_average_overrun(int i, const struct timespec *now, int seconds)
static void
-shift_write_average(void)
+shift_write_average(struct status *s)
{
- write_average_i--;
- memmove(&write_average_begin_times[0], &write_average_begin_times[1],
- (size_t)write_average_i * sizeof(*write_average_begin_times));
- memmove(&write_average_amounts[0], &write_average_amounts[1],
- (size_t)write_average_i * sizeof(*write_average_amounts));
+ s->write_average_i -= 1;
+ memmove(&s->write_average_begin_times[0], &s->write_average_begin_times[1],
+ (size_t)s->write_average_i * sizeof(*s->write_average_begin_times));
+ memmove(&s->write_average_amounts[0], &s->write_average_amounts[1],
+ (size_t)s->write_average_i * sizeof(*s->write_average_amounts));
}
void
-wravg_init(const struct timespec *start_time)
+wravg_init(const struct timespec *start_time, struct status *s)
{
- write_average_begin_times[0] = *start_time;
+ s->write_average_begin_times[0] = *start_time;
}
void
-wravg_update_write(ssize_t amount)
+wravg_update_write(ssize_t amount, struct status *s)
{
if (amount > 0)
- write_average_amounts[write_average_i] += (off_t)amount;
+ s->write_average_amounts[s->write_average_i] += (off_t)amount;
}
void
-wravg_update_time(const struct timespec *now)
+wravg_update_time(struct status *s)
{
- if (was_write_average_overrun(write_average_i, now, 1)) {
- write_average_i++;
- if (write_average_i == ELEMSOF(write_average_amounts))
- shift_write_average();
- write_average_begin_times[write_average_i] = *now;
- write_average_amounts[write_average_i] = 0;
+ if (was_write_average_overrun(s->write_average_i, 1, s)) {
+ s->write_average_i += 1;
+ if (s->write_average_i == WRAVG_STEPS)
+ shift_write_average(s);
+ s->write_average_begin_times[s->write_average_i] = s->now;
+ s->write_average_amounts[s->write_average_i] = 0;
}
- while (write_average_i && was_write_average_overrun(0, now, (int)ELEMSOF(write_average_amounts)))
- shift_write_average();
+ while (s->write_average_i && was_write_average_overrun(0, WRAVG_STEPS, s))
+ shift_write_average(s);
}
const char *
-wravg_get(const struct timespec *now)
+wravg_get(struct status *s)
{
static char buf[512];
@@ -74,10 +69,10 @@ wravg_get(const struct timespec *now)
double write_average;
int i;
- for (i = 0; i <= write_average_i; i++)
- write_average_sum += write_average_amounts[i];
+ for (i = 0; i <= s->write_average_i; i++)
+ write_average_sum += s->write_average_amounts[i];
- libsimple_difftimespec(&write_average_time, now, &write_average_begin_times[0]);
+ libsimple_difftimespec(&write_average_time, &s->now, &s->write_average_begin_times[0]);
if (write_average_time.tv_sec < 0)
return "-";