diff options
author | David Goulet <dgoulet@torproject.org> | 2019-05-29 11:34:07 -0400 |
---|---|---|
committer | George Kadianakis <desnacked@riseup.net> | 2019-06-11 14:02:22 +0300 |
commit | 7cf9d54e6d7a08f169a27f7d76731e61ebe63fb0 (patch) | |
tree | 8869dabe1bec60425726b8366774b654e58ced94 /src/lib/evloop/token_bucket.h | |
parent | 24a2352d56d807320c45fcdd8c74435bda4302c2 (diff) | |
download | tor-7cf9d54e6d7a08f169a27f7d76731e61ebe63fb0.tar.gz tor-7cf9d54e6d7a08f169a27f7d76731e61ebe63fb0.zip |
token-bucket: Implement a single counter object
Closes #30687.
Signed-off-by: David Goulet <dgoulet@torproject.org>
Diffstat (limited to 'src/lib/evloop/token_bucket.h')
-rw-r--r-- | src/lib/evloop/token_bucket.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/lib/evloop/token_bucket.h b/src/lib/evloop/token_bucket.h index 9398d2baa3..35b4246b12 100644 --- a/src/lib/evloop/token_bucket.h +++ b/src/lib/evloop/token_bucket.h @@ -103,6 +103,35 @@ token_bucket_rw_get_write(const token_bucket_rw_t *bucket) return token_bucket_raw_get(&bucket->write_bucket); } +/** + * A specialized bucket containing a single counter. + */ + +typedef struct token_bucket_ctr_t { + token_bucket_cfg_t cfg; + token_bucket_raw_t counter; + uint32_t last_refilled_at_timestamp; +} token_bucket_ctr_t; + +void token_bucket_ctr_init(token_bucket_ctr_t *bucket, uint32_t rate, + uint32_t burst, uint32_t now_ts); +void token_bucket_ctr_adjust(token_bucket_ctr_t *bucket, uint32_t rate, + uint32_t burst); +void token_bucket_ctr_reset(token_bucket_ctr_t *bucket, uint32_t now_ts); +void token_bucket_ctr_refill(token_bucket_ctr_t *bucket, uint32_t now_ts); + +static inline bool +token_bucket_ctr_dec(token_bucket_ctr_t *bucket, ssize_t n) +{ + return token_bucket_raw_dec(&bucket->counter, n); +} + +static inline size_t +token_bucket_ctr_get(const token_bucket_ctr_t *bucket) +{ + return token_bucket_raw_get(&bucket->counter); +} + #ifdef TOKEN_BUCKET_PRIVATE /* To avoid making the rates too small, we consider units of "steps", |