From: Nick Mathewson Date: Fri, 12 Mar 2010 05:46:39 +0000 (-0500) Subject: Functions to manipulate existing rate limiting groups. X-Git-Tag: release-2.0.5-beta~94 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ee41aca63e27f6c5a91a01978b409f5994d03817;p=libevent 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. --- diff --git a/bufferevent_ratelim.c b/bufferevent_ratelim.c index bb22904a..c6b7e248 100644 --- a/bufferevent_ratelim.c +++ b/bufferevent_ratelim.c @@ -614,6 +614,46 @@ bufferevent_rate_limit_group_new(struct event_base *base, return g; } +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) diff --git a/include/event2/bufferevent.h b/include/event2/bufferevent.h index 7d98acda..15accf97 100644 --- a/include/event2/bufferevent.h +++ b/include/event2/bufferevent.h @@ -585,8 +585,19 @@ int bufferevent_set_rate_limit(struct bufferevent *bev, struct bufferevent_rate_limit_group *bufferevent_rate_limit_group_new( struct event_base *base, const struct ev_token_bucket_cfg *cfg); -/*XXX we need a bufferevent_rate_limit_group_set_cfg */ -/*XXX we need a bufferevent_rate_limit_group_free */ +/** + Change the rate-limiting settings for a given rate-limiting group. + + Return 0 on success, -1 on failure. +*/ +int bufferevent_rate_limit_group_set_cfg( + struct bufferevent_rate_limit_group *, + const struct ev_token_bucket_cfg *); +/** + Free a rate-limiting group. The group must have no members when + this function is called. +*/ +void bufferevent_rate_limit_group_free(struct bufferevent_rate_limit_group *); /** Add 'bev' to the list of bufferevents whose aggregate reading and writing