From 61e25238728dd5cb9922932a5b7279eb6cdb15da Mon Sep 17 00:00:00 2001 From: rbuj Date: Wed, 2 Dec 2020 09:54:00 +0100 Subject: multiload: Use common subdirs - src, data --- multiload/src/autoscaler.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 multiload/src/autoscaler.c (limited to 'multiload/src/autoscaler.c') diff --git a/multiload/src/autoscaler.c b/multiload/src/autoscaler.c new file mode 100644 index 00000000..735b2713 --- /dev/null +++ b/multiload/src/autoscaler.c @@ -0,0 +1,51 @@ +#include +#include + +#include "autoscaler.h" + +/* i wish i could have used C99 initializers instead of writing this function */ +void autoscaler_init(AutoScaler *that, unsigned interval, unsigned floor) +{ + that->update_interval = interval; + that->floor = floor; + that->max = 0; + that->count = 0; + that->last_update = 0; + that->sum = 0.0f; + that->last_average = 0.0f; +} + + +unsigned autoscaler_get_max(AutoScaler *that, unsigned current) +{ + time_t now; + + that->sum += current; + that->count++; + time(&now); + + if((float)difftime(now, that->last_update) > that->update_interval) + { + float new_average = that->sum / that->count; + float average; + + if(new_average < that->last_average) + average = ((that->last_average * 0.5f) + new_average) / 1.5f; + else + average = new_average; + + that->max = average * 1.2f; + + that->sum = 0.0f; + that->count = 0; + that->last_update = now; + that->last_average = average; + } + + that->max = MAX(that->max, current); + that->max = MAX(that->max, that->floor); +#if 0 + printf("%p max = %u, current = %u, last_average = %f\n", that, that->max, current, that->last_average); +#endif + return that->max; +} -- cgit v1.2.1