diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-02-22 13:59:34 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-09-27 14:22:18 -0400 |
commit | ffd5070b04b3db4409d8e3dc933ffc7d12b5219d (patch) | |
tree | f1fcfa7d71f88f9b005637aa6df804d61f1f3085 /src/or/connection_or.c | |
parent | 98ec959c9c1d2b0a872926a3cafe42742520397a (diff) | |
download | tor-ffd5070b04b3db4409d8e3dc933ffc7d12b5219d.tar tor-ffd5070b04b3db4409d8e3dc933ffc7d12b5219d.tar.gz |
Convert bufferevents to use rate-limiting.
This requires the latest Git version of Libevent as of 24 March 2010.
In the future, we'll just say it requires Libevent 2.0.5-alpha or
later.
Since Libevent doesn't yet support hierarchical rate limit groups,
there isn't yet support for tracking relayed-bytes separately when
using the bufferevent system. If a future version does add support
for hierarchical buckets, we can add that back in.
Diffstat (limited to 'src/or/connection_or.c')
-rw-r--r-- | src/or/connection_or.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 2fbc230bc..044197d83 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -388,6 +388,21 @@ connection_or_update_token_buckets_helper(or_connection_t *conn, int reset, conn->bandwidthrate = rate; conn->bandwidthburst = burst; +#ifdef USE_BUFFEREVENTS + { + const struct timeval *tick = tor_libevent_get_one_tick_timeout(); + struct ev_token_bucket_cfg *cfg, *old_cfg; + int rate_per_tick = rate / TOR_LIBEVENT_TICKS_PER_SECOND; + cfg = ev_token_bucket_cfg_new(rate_per_tick, burst, rate_per_tick, + burst, tick); + old_cfg = conn->bucket_cfg; + if (conn->_base.bufev) + bufferevent_set_rate_limit(conn->_base.bufev, cfg); + if (old_cfg) + ev_token_bucket_cfg_free(old_cfg); + conn->bucket_cfg = cfg; + } +#else if (reset) { /* set up the token buckets to be full */ conn->read_bucket = conn->write_bucket = burst; return; @@ -398,6 +413,7 @@ connection_or_update_token_buckets_helper(or_connection_t *conn, int reset, conn->read_bucket = burst; if (conn->write_bucket > burst) conn->write_bucket = burst; +#endif } /** Either our set of relays or our per-conn rate limits have changed. @@ -879,6 +895,9 @@ connection_tls_start_handshake(or_connection_t *conn, int receiving) return -1; } conn->_base.bufev = b; + if (conn->bucket_cfg) + bufferevent_set_rate_limit(conn->_base.bufev, conn->bucket_cfg); + connection_enable_rate_limiting(TO_CONN(conn)); bufferevent_setcb(b, connection_handle_read_cb, connection_handle_write_cb, connection_or_handle_event_cb, |