summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-08-24 16:17:05 -0400
committerNick Mathewson <nickm@torproject.org>2011-08-24 16:17:05 -0400
commit5b18f13048d4d6e65ee93438a052e4d904f3f639 (patch)
tree7bec7a520cb463d5b59ee4d7cdd4db625550303d
parent6736852eaa0e6df52b32eb2ed666688ca8d80429 (diff)
downloadlibevent-5b18f13048d4d6e65ee93438a052e4d904f3f639.tar.gz
Make rate limiting work with common_timeout logic
-rw-r--r--bufferevent_ratelim.c5
-rw-r--r--event-internal.h3
-rw-r--r--event.c2
3 files changed, 8 insertions, 2 deletions
diff --git a/bufferevent_ratelim.c b/bufferevent_ratelim.c
index 827b346c..31d385b5 100644
--- a/bufferevent_ratelim.c
+++ b/bufferevent_ratelim.c
@@ -43,6 +43,7 @@
#include "bufferevent-internal.h"
#include "mm-internal.h"
#include "util-internal.h"
+#include "event-internal.h"
int
ev_token_bucket_init(struct ev_token_bucket *bucket,
@@ -165,7 +166,8 @@ ev_token_bucket_cfg_new(size_t read_rate, size_t read_burst,
r->read_maximum = read_burst;
r->write_maximum = write_burst;
memcpy(&r->tick_timeout, tick_len, sizeof(struct timeval));
- r->msec_per_tick = (tick_len->tv_sec * 1000) + tick_len->tv_usec/1000;
+ r->msec_per_tick = (tick_len->tv_sec * 1000) +
+ (tick_len->tv_usec & COMMON_TIMEOUT_MICROSECONDS_MASK)/1000;
return r;
}
@@ -518,6 +520,7 @@ _bev_group_refill_callback(evutil_socket_t fd, short what, void *arg)
event_base_gettimeofday_cached(event_get_base(&g->master_refill_event), &now);
LOCK_GROUP(g);
+
tick = ev_token_bucket_get_tick(&now, &g->rate_limit_cfg);
ev_token_bucket_update(&g->rate_limit, &g->rate_limit_cfg, tick);
diff --git a/event-internal.h b/event-internal.h
index 6caf4d9c..a8e744df 100644
--- a/event-internal.h
+++ b/event-internal.h
@@ -146,6 +146,9 @@ struct common_timeout_list {
struct event_base *base;
};
+/** Mask used to get the real tv_usec value from a common timeout. */
+#define COMMON_TIMEOUT_MICROSECONDS_MASK 0x000fffff
+
struct event_change;
/* List of 'changes' since the last call to eventop.dispatch. Only maintained
diff --git a/event.c b/event.c
index ec470d32..e331331d 100644
--- a/event.c
+++ b/event.c
@@ -1057,7 +1057,7 @@ event_signal_closure(struct event_base *base, struct event *ev)
* of index into the event_base's aray of common timeouts.
*/
-#define MICROSECONDS_MASK 0x000fffff
+#define MICROSECONDS_MASK COMMON_TIMEOUT_MICROSECONDS_MASK
#define COMMON_TIMEOUT_IDX_MASK 0x0ff00000
#define COMMON_TIMEOUT_IDX_SHIFT 20
#define COMMON_TIMEOUT_MASK 0xf0000000