return us.has_value ? us.rate : NAN;
}
-__attribute__((unused)) static gauge_t usage_rate(usage_t u, size_t cpu,
- state_t state) {
+static gauge_t usage_rate(usage_t u, size_t cpu, state_t state) {
if (state == STATE_ACTIVE) {
return usage_active_rate(u, cpu);
}
u->states_num = 0;
}
+__attribute__((unused)) static gauge_t usage_ratio(usage_t u, size_t cpu,
+ state_t state) {
+ gauge_t global_rate =
+ usage_global_rate(u, STATE_ACTIVE) + usage_global_rate(u, STATE_IDLE);
+ return usage_rate(u, cpu, state) / global_rate;
+}
+
/* Takes the zero-index number of a CPU and makes sure that the module-global
* cpu_states buffer is large enough. Returne ENOMEM on erorr. */
static int cpu_states_alloc(size_t cpu_num) /* {{{ */
#include "cpu.c" /* sic */
#include "testing.h"
-DEF_TEST(usage_simple_rate) {
+DEF_TEST(usage_rate) {
usage_t usage = {0};
cdtime_t t0 = TIME_T_TO_CDTIME_T(100);
return 0;
}
-DEF_TEST(usage_active) {
+DEF_TEST(usage_ratio) {
+ usage_t usage = {0};
+
+ cdtime_t t0 = TIME_T_TO_CDTIME_T(100);
+ usage_init(&usage, t0);
+ for (size_t cpu = 0; cpu < 4; cpu++) {
+ for (state_t s = 0; s < STATE_ACTIVE; s++) {
+ usage_record(&usage, cpu, s, 1000);
+ }
+ }
+
+ cdtime_t t1 = t0 + TIME_T_TO_CDTIME_T(10);
+ usage_init(&usage, t1);
+ derive_t global_increment = 0;
+ for (size_t cpu = 0; cpu < 4; cpu++) {
+ for (state_t s = 0; s < STATE_ACTIVE; s++) {
+ derive_t increment = ((derive_t)cpu * STATE_ACTIVE) + ((derive_t)s);
+ global_increment += increment;
+ usage_record(&usage, cpu, s, 1000 + increment);
+ }
+ }
+
+ for (size_t cpu = 0; cpu < 4; cpu++) {
+ derive_t active_increment = 0;
+ for (state_t s = 0; s < STATE_ACTIVE; s++) {
+ derive_t increment = ((derive_t)cpu * STATE_ACTIVE) + ((derive_t)s);
+ if (s != STATE_IDLE) {
+ active_increment += increment;
+ }
+ gauge_t want_ratio = ((gauge_t)increment) / ((gauge_t)global_increment);
+ EXPECT_EQ_DOUBLE(want_ratio, usage_ratio(usage, cpu, s));
+ }
+ gauge_t want_active_ratio =
+ ((gauge_t)active_increment) / ((gauge_t)global_increment);
+ EXPECT_EQ_DOUBLE(want_active_ratio, usage_ratio(usage, cpu, STATE_ACTIVE));
+ }
+
+ gauge_t sum = 0;
+ for (size_t cpu = 0; cpu < 4; cpu++) {
+ for (state_t s = 0; s < STATE_ACTIVE; s++) {
+ gauge_t rate = usage_ratio(usage, cpu, s);
+ sum += rate;
+ }
+ }
+ EXPECT_EQ_DOUBLE(1.0, sum);
+
+ usage_reset(&usage);
+ return 0;
+}
+
+DEF_TEST(usage_active_rate) {
usage_t usage = {0};
cdtime_t t0 = TIME_T_TO_CDTIME_T(100);
}
int main(void) {
- RUN_TEST(usage_simple_rate);
- RUN_TEST(usage_active);
+ RUN_TEST(usage_rate);
+ RUN_TEST(usage_ratio);
+ RUN_TEST(usage_active_rate);
RUN_TEST(usage_global_rate);
END_TEST;