|
Tor 0.4.9.3-alpha-dev
|
Wrapper around William Ahern's fast hierarchical timer wheel implementation, to tie it in with a libevent backend. More...
#include "orconfig.h"#include "lib/evloop/compat_libevent.h"#include "lib/evloop/timers.h"#include "lib/intmath/muldiv.h"#include "lib/log/log.h"#include "lib/log/util_bug.h"#include "lib/malloc/malloc.h"#include "lib/time/compat_time.h"#include "ext/timeouts/timeout.c"Go to the source code of this file.
Data Structures | |
| struct | timeout_cb_t |
Macros | |
| #define | TOR_TIMERS_PRIVATE |
| #define | TIMEOUT_PUBLIC static |
| #define | TIMEOUT_DISABLE_INTERVALS |
| #define | TIMEOUT_DISABLE_RELATIVE_ACCESS |
| #define | TIMEOUT_CB_OVERRIDE |
| #define | WHEEL_NUM 5 |
| #define | USEC_PER_TICK 100 |
| #define | USEC_PER_SEC 1000000 |
| #define | MIN_CHECK_SECONDS 3600 |
| #define | MIN_CHECK_TICKS (((timeout_t)MIN_CHECK_SECONDS) * (1000000 / USEC_PER_TICK)) |
Functions | |
| static timeout_t | tv_to_timeout (const struct timeval *tv) |
| static void | timeout_to_tv (timeout_t t, struct timeval *tv_out) |
| static void | timer_advance_to_cur_time (const monotime_t *now) |
| static void | libevent_timer_reschedule (void) |
| STATIC void | timers_run_pending (void) |
| static void | libevent_timer_callback (mainloop_event_t *ev, void *arg) |
| void | timers_initialize (void) |
| void | timers_shutdown (void) |
| tor_timer_t * | timer_new (timer_cb_fn_t cb, void *arg) |
| void | timer_free_ (tor_timer_t *t) |
| void | timer_set_cb (tor_timer_t *t, timer_cb_fn_t cb, void *arg) |
| void | timer_get_cb (const tor_timer_t *t, timer_cb_fn_t *cb_out, void **arg_out) |
| void | timer_schedule (tor_timer_t *t, const struct timeval *tv) |
| void | timer_disable (tor_timer_t *t) |
Variables | |
| static struct timeouts * | global_timeouts = NULL |
| static struct mainloop_event_t * | global_timer_event = NULL |
| static monotime_t | start_of_time |
Wrapper around William Ahern's fast hierarchical timer wheel implementation, to tie it in with a libevent backend.
Only use these functions from the main thread.
The main advantage of tor_timer_t over using libevent's timers is that they're way more efficient if we need to have thousands or millions of them. For more information, see https://www.25thandclement.com/~william/projects/timeout.c.html
Periodic timers are available in the backend, but I've turned them off. We can turn them back on if needed.
Definition in file timers.c.
| #define MIN_CHECK_SECONDS 3600 |
| #define MIN_CHECK_TICKS (((timeout_t)MIN_CHECK_SECONDS) * (1000000 / USEC_PER_TICK)) |
| #define USEC_PER_SEC 1000000 |
| #define USEC_PER_TICK 100 |
We need to choose this value carefully. Because we're using timer wheels, it actually costs us to have extra resolution we don't use. So for now, I'm going to define our resolution as .1 msec, and hope that's good enough.
Note that two of the most popular libevent backends (epoll without timerfd, and windows select), simply can't support sub-millisecond resolution, do this is optimistic for a lot of users.
|
static |
Invoked when the libevent timer has expired: see which tor_timer_t events have fired, activate their callbacks, and reschedule the libevent timer.
Definition at line 190 of file timers.c.
Referenced by timers_initialize().
|
static |
Adjust the time at which the libevent timer should fire based on the next-expiring time in global_timeouts
Definition at line 155 of file timers.c.
Referenced by libevent_timer_callback(), timer_schedule(), and timers_initialize().
|
static |
Convert the timeout in t to a timeval in tv_out. Only use this for delays, not absolute times.
Definition at line 132 of file timers.c.
Referenced by libevent_timer_reschedule().
|
static |
Update the timer tv to the current time in tv.
Definition at line 143 of file timers.c.
Referenced by libevent_timer_reschedule(), timer_schedule(), and timers_run_pending().
| void timer_disable | ( | tor_timer_t * | t | ) |
Cancel the timer t if it is currently scheduled. (It's okay to call this on an unscheduled timer.
Definition at line 326 of file timers.c.
Referenced by circpad_machine_remove_token(), circpad_machine_schedule_padding(), and circpad_machine_spec_transition().
| void timer_free_ | ( | tor_timer_t * | t | ) |
| void timer_get_cb | ( | const tor_timer_t * | t, |
| timer_cb_fn_t * | cb_out, | ||
| void ** | arg_out | ||
| ) |
| tor_timer_t * timer_new | ( | timer_cb_fn_t | cb, |
| void * | arg | ||
| ) |
Allocate and return a new timer, with given callback and argument.
Definition at line 250 of file timers.c.
Referenced by channelpadding_schedule_padding(), and circpad_machine_schedule_padding().
| void timer_schedule | ( | tor_timer_t * | t, |
| const struct timeval * | tv | ||
| ) |
Schedule the timer t to fire at the current time plus a delay of delay microseconds. All times are relative to monotime_get().
Definition at line 301 of file timers.c.
Referenced by channelpadding_schedule_padding(), and circpad_machine_schedule_padding().
| void timer_set_cb | ( | tor_timer_t * | t, |
| timer_cb_fn_t | cb, | ||
| void * | arg | ||
| ) |
Change the callback and argument associated with a timer t.
Definition at line 276 of file timers.c.
Referenced by channelpadding_schedule_padding(), circpad_machine_schedule_padding(), and timer_new().
| void timers_initialize | ( | void | ) |
| STATIC void timers_run_pending | ( | void | ) |
Run the callback of every timer that has expired, based on the current output of monotime_get().
Definition at line 173 of file timers.c.
Referenced by libevent_timer_callback().
| void timers_shutdown | ( | void | ) |
Release all storage held in the timers subsystem. Does not fire timers.
Definition at line 234 of file timers.c.
Referenced by tor_cleanup().
|
static |
Convert the timeval in tv to a timeout_t, and return it.
The output resolution is set by USEC_PER_TICK. Only use this to convert delays to number of ticks; the time represented by 0 is undefined.
Definition at line 120 of file timers.c.
Referenced by timer_schedule().
|
static |
|
static |