aboutsummaryrefslogtreecommitdiff
path: root/src/common/compat_libevent.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-09-07 22:00:48 -0400
committerNick Mathewson <nickm@torproject.org>2011-09-22 15:07:34 -0400
commit41dfc4c19c4e0ee37d092fa0ed7faf349e6ab467 (patch)
tree621914608ae5e2031a044448ee3c07d68144dbb6 /src/common/compat_libevent.c
parent052b95e2f196211c97b33ce8c68960e1c2561ea0 (diff)
downloadtor-41dfc4c19c4e0ee37d092fa0ed7faf349e6ab467.tar
tor-41dfc4c19c4e0ee37d092fa0ed7faf349e6ab467.tar.gz
Make bufferevents work with TokenBucketRefillInterval
Diffstat (limited to 'src/common/compat_libevent.c')
-rw-r--r--src/common/compat_libevent.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c
index beae9502d..320173870 100644
--- a/src/common/compat_libevent.c
+++ b/src/common/compat_libevent.c
@@ -169,6 +169,7 @@ struct event_base *the_event_base = NULL;
#ifdef USE_BUFFEREVENTS
static int using_iocp_bufferevents = 0;
+static void tor_libevent_set_tick_timeout(int msec_per_tick);
int
tor_libevent_using_iocp_bufferevents(void)
@@ -236,6 +237,10 @@ tor_libevent_initialize(tor_libevent_cfg *torcfg)
"You have a *VERY* old version of libevent. It is likely to be buggy; "
"please build Tor with a more recent version.");
#endif
+
+#ifdef USE_BUFFEREVENTS
+ tor_libevent_set_tick_timeout(torcfg->msec_per_tick);
+#endif
}
/** Return the current Libevent event base that we're set up to use. */
@@ -598,26 +603,29 @@ static const struct timeval *one_tick = NULL;
/**
* Return a special timeout to be passed whenever libevent's O(1) timeout
* implementation should be used. Only use this when the timer is supposed
- * to fire after 1 / TOR_LIBEVENT_TICKS_PER_SECOND seconds have passed.
+ * to fire after msec_per_tick ticks have elapsed.
*/
const struct timeval *
tor_libevent_get_one_tick_timeout(void)
{
- if (PREDICT_UNLIKELY(one_tick == NULL)) {
- struct event_base *base = tor_libevent_get_base();
- struct timeval tv;
- if (TOR_LIBEVENT_TICKS_PER_SECOND == 1) {
- tv.tv_sec = 1;
- tv.tv_usec = 0;
- } else {
- tv.tv_sec = 0;
- tv.tv_usec = 1000000 / TOR_LIBEVENT_TICKS_PER_SECOND;
- }
- one_tick = event_base_init_common_timeout(base, &tv);
- }
+ tor_assert(one_tick);
return one_tick;
}
+/** Initialize the common timeout that we'll use to refill the buckets every
+ * time a tick elapses. */
+static void
+tor_libevent_set_tick_timeout(int msec_per_tick)
+{
+ struct event_base *base = tor_libevent_get_base();
+ struct timeval tv;
+
+ tor_assert(! one_tick);
+ tv.tv_sec = msec_per_tick / 1000;
+ tv.tv_usec = (msec_per_tick % 1000) * 1000;
+ one_tick = event_base_init_common_timeout(base, &tv);
+}
+
static struct bufferevent *
tor_get_root_bufferevent(struct bufferevent *bev)
{