]> granicus.if.org Git - libevent/commitdiff
Functions to manipulate existing rate limiting groups.
authorNick Mathewson <nickm@torproject.org>
Fri, 12 Mar 2010 05:46:39 +0000 (00:46 -0500)
committerNick Mathewson <nickm@torproject.org>
Fri, 12 Mar 2010 05:47:39 +0000 (00:47 -0500)
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.

bufferevent_ratelim.c
include/event2/bufferevent.h

index bb22904af996dd387df93c7956384ae054128913..c6b7e2485cd9deb6b93d4ac19ef048dfaa94d55e 100644 (file)
@@ -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)
index 7d98acdae607eb0dc24063b201e676955eb3bc9c..15accf9777ef4720b500d74e225e3766e5f0ff6b 100644 (file)
@@ -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