From: Nick Mathewson Date: Wed, 24 Aug 2011 20:17:05 +0000 (-0400) Subject: Make rate limiting work with common_timeout logic X-Git-Tag: release-2.0.14-stable~12 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5b18f13048d4d6e65ee93438a052e4d904f3f639;p=libevent Make rate limiting work with common_timeout logic --- 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