summaryrefslogtreecommitdiff
path: root/bufferevent_ratelim.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2010-03-12 00:46:39 -0500
committerNick Mathewson <nickm@torproject.org>2010-03-12 00:47:39 -0500
commitee41aca63e27f6c5a91a01978b409f5994d03817 (patch)
treec8cecc55a55190882eb6dee35c2a2ef6d854d13e /bufferevent_ratelim.c
parentcdd4c4905be7e56675c1fcccf9d04c1777ae0da1 (diff)
downloadlibevent-ee41aca63e27f6c5a91a01978b409f5994d03817.tar.gz
Functions to manipulate existing rate limiting groups.
This patch adds a function to change the current rate limit of a rate limiting group, and another to free an empty rate limiting group.
Diffstat (limited to 'bufferevent_ratelim.c')
-rw-r--r--bufferevent_ratelim.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/bufferevent_ratelim.c b/bufferevent_ratelim.c
index bb22904a..c6b7e248 100644
--- a/bufferevent_ratelim.c
+++ b/bufferevent_ratelim.c
@@ -615,6 +615,46 @@ bufferevent_rate_limit_group_new(struct event_base *base,
}
int
+bufferevent_rate_limit_group_set_cfg(
+ struct bufferevent_rate_limit_group *g,
+ const struct ev_token_bucket_cfg *cfg)
+{
+ int same_tick;
+ if (!g || !cfg)
+ return -1;
+
+ LOCK_GROUP(g);
+ same_tick = evutil_timercmp(
+ &g->rate_limit_cfg.tick_timeout, &cfg->tick_timeout, ==);
+ memcpy(&g->rate_limit_cfg, cfg, sizeof(g->rate_limit_cfg));
+
+ if (g->rate_limit.read_limit > cfg->read_maximum)
+ g->rate_limit.read_limit = cfg->read_maximum;
+ if (g->rate_limit.write_limit > cfg->write_maximum)
+ g->rate_limit.write_limit = cfg->write_maximum;
+
+ if (!same_tick) {
+ /* This can cause a hiccup in the schedule */
+ event_add(&g->master_refill_event, &cfg->tick_timeout);
+ }
+
+ UNLOCK_GROUP(g);
+ return 0;
+}
+
+
+void
+bufferevent_rate_limit_group_free(struct bufferevent_rate_limit_group *g)
+{
+ LOCK_GROUP(g);
+ EVUTIL_ASSERT(0 == g->n_members);
+ event_del(&g->master_refill_event);
+ UNLOCK_GROUP(g);
+ EVTHREAD_FREE_LOCK(g->lock, EVTHREAD_LOCKTYPE_RECURSIVE);
+ mm_free(g);
+}
+
+int
bufferevent_add_to_rate_limit_group(struct bufferevent *bev,
struct bufferevent_rate_limit_group *g)
{