From 424a5b489d071f1e96c0a663fa674bf16dcd08f4 Mon Sep 17 00:00:00 2001 From: Clemens Famulla-Conrad Date: Thu, 15 Jun 2023 10:39:26 +0200 Subject: [PATCH] timer: add ni_timeout_random() function --- include/wicked/time.h | 2 ++ src/timer.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/wicked/time.h b/include/wicked/time.h index 166f517ac..3adff6e45 100644 --- a/include/wicked/time.h +++ b/include/wicked/time.h @@ -100,4 +100,6 @@ extern ni_timeout_t ni_timeout_left(const struct timeval *, const struct timeva extern ni_bool_t ni_timeval_add_timeout(struct timeval *, ni_timeout_t); +extern ni_timeout_t ni_timeout_random_range(ni_timeout_t min, ni_timeout_t max); + #endif /* WICKED_TIME_H */ diff --git a/src/timer.c b/src/timer.c index b37b455e9..ab67c7863 100644 --- a/src/timer.c +++ b/src/timer.c @@ -430,6 +430,37 @@ ni_timeout_randomize(ni_timeout_t timeout, const ni_int_range_t *jitter) return rtimeout; } +ni_timeout_t +ni_timeout_random_range(ni_timeout_t min, ni_timeout_t max) +{ + ni_timeout_t randval = 0; + ni_timeout_t range; + + if (max <= min) + return min; + + if (min >= NI_TIMEOUT_INFINITE || max >= NI_TIMEOUT_INFINITE) + return NI_TIMEOUT_INFINITE; + + range = max - min + 1; + + if (range > RAND_MAX) { + /* + * Assume the largest number RAND_MAX is INT_MAX, + * even random returns long int (64 or 32bit)... + */ + size_t count = sizeof(ni_timeout_t) / sizeof(int); + size_t i, bits = (sizeof(int) * 8) - 1; + + for (i = 0; i < count; i++) + randval |= (ni_timeout_t)random() << (i * bits); + } else { + randval = (ni_timeout_t)random(); + } + + return min + (randval % range); +} + static ni_timeout_t ni_timeout_arm_randomized(struct timeval *deadline, ni_timeout_t timeout, const ni_int_range_t *jitter) {