tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 14cd8bdd4ba6f4c5946ecd9877c77c9ba305bbe8
parent 84d18f70f3400df3e9c3b3c47288e82cd9160f6e
Author: David Goulet <dgoulet@torproject.org>
Date:   Thu, 14 Sep 2017 14:22:22 -0400

sched: Don't expose the global scheduler libevent object

Instead, add wrappers to do the needed action the different scheduler needs
with the libevent object.

Signed-off-by: David Goulet <dgoulet@torproject.org>

Diffstat:
Msrc/or/scheduler.c | 25++++++++++++++++++-------
Msrc/or/scheduler.h | 3++-
Msrc/or/scheduler_kist.c | 13+++----------
Msrc/or/scheduler_vanilla.c | 12+++---------
4 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/src/or/scheduler.c b/src/or/scheduler.c @@ -214,13 +214,6 @@ get_channels_pending(void) return channels_pending; } -/* Return our libevent scheduler event. */ -struct event * -get_run_sched_ev(void) -{ - return run_sched_ev; -} - /* Comparison function to use when sorting pending channels */ MOCK_IMPL(int, scheduler_compare_channels, (const void *c1_v, const void *c2_v)) @@ -496,6 +489,24 @@ scheduler_channel_has_waiting_cells,(channel_t *chan)) } } +/* Add the scheduler event to the set of pending events with next_run being + * the time up to libevent should wait before triggering the event. */ +void +scheduler_ev_add(const struct timeval *next_run) +{ + tor_assert(run_sched_ev); + tor_assert(next_run); + event_add(run_sched_ev, next_run); +} + +/* Make the scheduler event active with the given flags. */ +void +scheduler_ev_active(int flags) +{ + tor_assert(run_sched_ev); + event_active(run_sched_ev, flags, 1); +} + /* * Initialize everything scheduling-related from config.c. Note this is only * called when Tor is starting up, while scheduler_t->init() is called both diff --git a/src/or/scheduler.h b/src/or/scheduler.h @@ -139,9 +139,10 @@ MOCK_DECL(void, scheduler_channel_has_waiting_cells, (channel_t *chan)); * Defined in scheduler.c *********************************/ smartlist_t *get_channels_pending(void); -struct event *get_run_sched_ev(void); MOCK_DECL(int, scheduler_compare_channels, (const void *c1_v, const void *c2_v)); +void scheduler_ev_active(int flags); +void scheduler_ev_add(const struct timeval *next_run); #ifdef TOR_UNIT_TESTS extern smartlist_t *channels_pending; diff --git a/src/or/scheduler_kist.c b/src/or/scheduler_kist.c @@ -471,14 +471,7 @@ kist_scheduler_schedule(void) struct monotime_t now; struct timeval next_run; int32_t diff; - struct event *ev = get_run_sched_ev(); - IF_BUG_ONCE(!ev) { - log_warn(LD_SCHED, "Wow we don't have a scheduler event. That's really " - "weird! We can't really schedule a scheduling run with libevent " - "without it. So we're going to stop trying now and hope we have " - "one next time. If we never get one, we're broken."); - return; - } + if (!have_work()) { return; } @@ -489,9 +482,9 @@ kist_scheduler_schedule(void) /* 1000 for ms -> us */ next_run.tv_usec = (sched_run_interval - diff) * 1000; /* Readding an event reschedules it. It does not duplicate it. */ - event_add(ev, &next_run); + scheduler_ev_add(&next_run); } else { - event_active(ev, EV_TIMEOUT, 1); + scheduler_ev_active(EV_TIMEOUT); } } diff --git a/src/or/scheduler_vanilla.c b/src/or/scheduler_vanilla.c @@ -43,15 +43,9 @@ vanilla_scheduler_schedule(void) if (!have_work()) { return; } - struct event *ev = get_run_sched_ev(); - IF_BUG_ONCE(!ev) { - log_warn(LD_SCHED, "Wow we don't have a scheduler event. That's really " - "weird! We can't really schedule a scheduling run with libevent " - "without it. So we're going to stop trying now and hope we have " - "one next time. If we never get one, we're broken."); - return; - } - event_active(ev, EV_TIMEOUT, 1); + + /* Activate our event so it can process channels. */ + scheduler_ev_active(EV_TIMEOUT); } static void