]> granicus.if.org Git - libevent/commitdiff
Make rate limiting work with common_timeout logic
authorNick Mathewson <nickm@torproject.org>
Wed, 24 Aug 2011 20:17:05 +0000 (16:17 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 24 Aug 2011 20:17:05 +0000 (16:17 -0400)
bufferevent_ratelim.c
event-internal.h
event.c

index 827b346cc949007b7239d6720d628efb38a92f4b..31d385b5a4998c11a43f297186dfc54f403d48b2 100644 (file)
@@ -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);
 
index 6caf4d9cda029edb24bc579c15a1034188269560..a8e744df72b2e77caac6906161d53e245827767a 100644 (file)
@@ -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 ec470d3213ab66267e01a89a0f40c1e847d8fddf..e331331dbd7ca4a48a5434bf3d61f2e8b6369ad3 100644 (file)
--- 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