diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-08-18 15:55:49 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-08-18 15:55:49 -0400 |
commit | ba9c1275c4b2325aed6a2fe2cc236794dab11052 (patch) | |
tree | 27be4318e4d65bff4e312a5476bcc184d69aa6cf /src/common/util.h | |
parent | d72edc4b78f0104823d156e605259d9d41e6f54c (diff) | |
download | tor-ba9c1275c4b2325aed6a2fe2cc236794dab11052.tar.gz tor-ba9c1275c4b2325aed6a2fe2cc236794dab11052.zip |
Add a generic rate-limited log mechanism, and use it in a few places
Incidentally fixes bug 1042.
Diffstat (limited to 'src/common/util.h')
-rw-r--r-- | src/common/util.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/common/util.h b/src/common/util.h index ba38f4c7ed..1e22bd5b1b 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -252,6 +252,34 @@ int ftime_maybe_before(time_t now, time_t when); int ftime_definitely_after(time_t now, time_t when); int ftime_definitely_before(time_t now, time_t when); +/* Rate-limiter */ + +/** A ratelim_t remembers how often an event is occurring, and how often + * it's allowed to occur. Typical usage is something like: + * + <pre> + if (possibly_very_frequent_event()) { + const int INTERVAL = 300; + static ratelim_t warning_limit = RATELIM_INIT(INTERVAL); + char *m; + if ((m = rate_limit_log(&warning_limit, approx_time()))) { + log_warn(LD_GENERAL, "The event occurred!%s", m); + tor_free(m); + } + } + </pre> + */ +typedef struct ratelim_t { + int rate; + time_t last_allowed; + int n_calls_since_last_time; +} ratelim_t; + +#define RATELIM_INIT(r) { (r), 0, 0 } + +int rate_limit_is_ready(ratelim_t *lim, time_t now); +char *rate_limit_log(ratelim_t *lim, time_t now); + /* File helpers */ ssize_t write_all(int fd, const char *buf, size_t count, int isSocket); ssize_t read_all(int fd, char *buf, size_t count, int isSocket); |