summaryrefslogtreecommitdiff
path: root/bufferevent_ratelim.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-08-17 22:08:06 -0400
committerNick Mathewson <nickm@torproject.org>2011-08-17 22:08:06 -0400
commitec670c15a7d7c41866edf45faf98448852257a4b (patch)
treeb9e02cea0b8ad3117139dc861c6d93e2f55d8bd9 /bufferevent_ratelim.c
parent3c63edd1f7ea1e26937466cf3ad16b7bf0e265e4 (diff)
parent04656ea85a1b6ec0fbe1fa126f8c81e9b17abab5 (diff)
downloadlibevent-ec670c15a7d7c41866edf45faf98448852257a4b.tar.gz
Merge remote-tracking branch 'origin/patches-2.0'
Conflict in buffer.c: the new file-segment logic conflicted with the solaris sendfile fix.
Diffstat (limited to 'bufferevent_ratelim.c')
-rw-r--r--bufferevent_ratelim.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/bufferevent_ratelim.c b/bufferevent_ratelim.c
index 7e51c2e5..5867476c 100644
--- a/bufferevent_ratelim.c
+++ b/bufferevent_ratelim.c
@@ -637,13 +637,15 @@ bufferevent_rate_limit_group_new(struct event_base *base,
ev_token_bucket_init(&g->rate_limit, cfg, tick, 0);
- g->min_share = 64;
event_assign(&g->master_refill_event, base, -1, EV_PERSIST,
_bev_group_refill_callback, g);
/*XXXX handle event_add failure */
event_add(&g->master_refill_event, &cfg->tick_timeout);
EVTHREAD_ALLOC_LOCK(g->lock, EVTHREAD_LOCKTYPE_RECURSIVE);
+
+ bufferevent_rate_limit_group_set_min_share(g, 64);
+
return g;
}
@@ -671,6 +673,9 @@ bufferevent_rate_limit_group_set_cfg(
event_add(&g->master_refill_event, &cfg->tick_timeout);
}
+ /* The new limits might force us to adjust min_share differently. */
+ bufferevent_rate_limit_group_set_min_share(g, g->configured_min_share);
+
UNLOCK_GROUP(g);
return 0;
}
@@ -683,6 +688,15 @@ bufferevent_rate_limit_group_set_min_share(
if (share > EV_SSIZE_MAX)
return -1;
+ g->configured_min_share = share;
+
+ /* Can't set share to less than the one-tick maximum. IOW, at steady
+ * state, at least one connection can go per tick. */
+ if (share > g->rate_limit_cfg.read_rate)
+ share = g->rate_limit_cfg.read_rate;
+ if (share > g->rate_limit_cfg.write_rate)
+ share = g->rate_limit_cfg.write_rate;
+
g->min_share = share;
return 0;
}