Browse Source

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>
David Goulet 6 years ago
parent
commit
14cd8bdd4b
4 changed files with 26 additions and 27 deletions
  1. 18 7
      src/or/scheduler.c
  2. 2 1
      src/or/scheduler.h
  3. 3 10
      src/or/scheduler_kist.c
  4. 3 9
      src/or/scheduler_vanilla.c

+ 18 - 7
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

+ 2 - 1
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;

+ 3 - 10
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);
   }
 }
 

+ 3 - 9
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