aboutsummaryrefslogtreecommitdiff
path: root/src/lib/evloop/token_bucket.h
diff options
context:
space:
mode:
authorGeorge Kadianakis <desnacked@riseup.net>2019-06-11 14:02:33 +0300
committerGeorge Kadianakis <desnacked@riseup.net>2019-06-11 14:02:33 +0300
commit646f7a9a94db1837f0c4a1c2ab7bc0b10736a82d (patch)
tree075527b8d30d0d4a070100d400ff9820dd193a00 /src/lib/evloop/token_bucket.h
parentb83dba7cb0dbd96c2be09edab47e6c16491c0a14 (diff)
parent7cf9d54e6d7a08f169a27f7d76731e61ebe63fb0 (diff)
downloadtor-646f7a9a94db1837f0c4a1c2ab7bc0b10736a82d.tar.gz
tor-646f7a9a94db1837f0c4a1c2ab7bc0b10736a82d.zip
Merge branch 'ticket30687_042_01'
Diffstat (limited to 'src/lib/evloop/token_bucket.h')
-rw-r--r--src/lib/evloop/token_bucket.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/lib/evloop/token_bucket.h b/src/lib/evloop/token_bucket.h
index 1ce6f1bf94..dde9bd65a4 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",