/* Modelled after Linux' lib/ratelimit.c by Dave Young
* <hidave.darkstar@gmail.com>, which is licensed GPLv2. */
-bool ratelimit_below(RateLimit *r) {
+bool ratelimit_below(RateLimit *rl) {
usec_t ts;
- assert(r);
+ assert(rl);
- if (!ratelimit_configured(r))
+ if (!ratelimit_configured(rl))
return true;
ts = now(CLOCK_MONOTONIC);
- if (r->begin <= 0 ||
- usec_sub_unsigned(ts, r->begin) > r->interval) {
- r->begin = ts; /* Start a new time window */
- r->num = 1; /* Reset counter */
+ if (rl->begin <= 0 ||
+ usec_sub_unsigned(ts, rl->begin) > rl->interval) {
+ rl->begin = ts; /* Start a new time window */
+ rl->num = 1; /* Reset counter */
return true;
}
- if (_unlikely_(r->num == UINT_MAX))
+ if (_unlikely_(rl->num == UINT_MAX))
return false;
- r->num++;
- return r->num <= r->burst;
+ rl->num++;
+ return rl->num <= rl->burst;
}
-unsigned ratelimit_num_dropped(RateLimit *r) {
- assert(r);
+unsigned ratelimit_num_dropped(const RateLimit *rl) {
+ assert(rl);
- if (r->num == UINT_MAX) /* overflow, return as special case */
+ if (rl->num == UINT_MAX) /* overflow, return as special case */
return UINT_MAX;
- return LESS_BY(r->num, r->burst);
+ return LESS_BY(rl->num, rl->burst);
}
usec_t ratelimit_end(const RateLimit *rl) {
rl->num = rl->begin = 0;
}
-static inline bool ratelimit_configured(RateLimit *rl) {
+static inline bool ratelimit_configured(const RateLimit *rl) {
return rl->interval > 0 && rl->burst > 0;
}
-bool ratelimit_below(RateLimit *r);
+bool ratelimit_below(RateLimit *rl);
-unsigned ratelimit_num_dropped(RateLimit *r);
+unsigned ratelimit_num_dropped(const RateLimit *rl);
usec_t ratelimit_end(const RateLimit *rl);
usec_t ratelimit_left(const RateLimit *rl);