diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-03-12 00:46:39 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-03-12 00:47:39 -0500 |
commit | ee41aca63e27f6c5a91a01978b409f5994d03817 (patch) | |
tree | c8cecc55a55190882eb6dee35c2a2ef6d854d13e /bufferevent_ratelim.c | |
parent | cdd4c4905be7e56675c1fcccf9d04c1777ae0da1 (diff) | |
download | libevent-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.c | 40 |
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) { |