Browse Source

sched: Make the scheduler object static

Each type of scheduler implements its own static scheduler_t object and
returns a reference to it.

This commit also makes it a const pointer that is it can only change inside
the scheduler type subsystem but not outside for extra protection.

Signed-off-by: David Goulet <dgoulet@torproject.org>
David Goulet 6 years ago
parent
commit
734dbfa590
5 changed files with 29 additions and 35 deletions
  1. 2 3
      src/or/scheduler.c
  2. 1 1
      src/or/scheduler.h
  3. 12 14
      src/or/scheduler_kist.c
  4. 12 15
      src/or/scheduler_vanilla.c
  5. 2 2
      src/test/test_scheduler.c

+ 2 - 3
src/or/scheduler.c

@@ -148,7 +148,7 @@
  * outside the scheduling system)
  *****************************************************************************/
 
-STATIC scheduler_t *the_scheduler;
+STATIC const scheduler_t *the_scheduler;
 
 /*
  * We keep a list of channels that are pending - i.e, have cells to write
@@ -317,7 +317,7 @@ select_scheduler(void)
 static void
 set_scheduler(void)
 {
-  scheduler_t *old_scheduler = the_scheduler;
+  const scheduler_t *old_scheduler = the_scheduler;
 
   /* From the options, select the scheduler type to set. */
   select_scheduler();
@@ -395,7 +395,6 @@ scheduler_free_all(void)
   if (the_scheduler && the_scheduler->free_all) {
     the_scheduler->free_all();
   }
-  tor_free(the_scheduler);
   the_scheduler = NULL;
 }
 

+ 1 - 1
src/or/scheduler.h

@@ -147,7 +147,7 @@ void scheduler_ev_add(const struct timeval *next_run);
 #ifdef TOR_UNIT_TESTS
 extern smartlist_t *channels_pending;
 extern struct event *run_sched_ev;
-extern scheduler_t *the_scheduler;
+extern const scheduler_t *the_scheduler;
 void scheduler_touch_channel(channel_t *chan);
 #endif /* TOR_UNIT_TESTS */
 

+ 12 - 14
src/or/scheduler_kist.c

@@ -103,8 +103,6 @@ static monotime_t scheduler_last_run;
 static double sock_buf_size_factor = 1.0;
 /* How often the scheduler runs. */
 STATIC int32_t sched_run_interval = 10;
-/* Stores the kist scheduler function pointers. */
-static scheduler_t *kist_scheduler = NULL;
 
 /*****************************************************************************
  * Internally called function implementations
@@ -637,23 +635,23 @@ kist_scheduler_run(void)
  * Externally called function implementations not called through scheduler_t
  *****************************************************************************/
 
+/* Stores the kist scheduler function pointers. */
+static scheduler_t kist_scheduler = {
+  .free_all = kist_free_all,
+  .on_channel_free = kist_on_channel_free,
+  .init = kist_scheduler_init,
+  .on_new_consensus = kist_scheduler_on_new_consensus,
+  .schedule = kist_scheduler_schedule,
+  .run = kist_scheduler_run,
+  .on_new_options = kist_scheduler_on_new_options,
+};
+
 /* Return the KIST scheduler object. If it didn't exists, return a newly
  * allocated one but init() is not called. */
 scheduler_t *
 get_kist_scheduler(void)
 {
-  if (!kist_scheduler) {
-    log_debug(LD_SCHED, "Allocating kist scheduler struct");
-    kist_scheduler = tor_malloc_zero(sizeof(*kist_scheduler));
-    kist_scheduler->free_all = kist_free_all;
-    kist_scheduler->on_channel_free = kist_on_channel_free;
-    kist_scheduler->init = kist_scheduler_init;
-    kist_scheduler->on_new_consensus = kist_scheduler_on_new_consensus;
-    kist_scheduler->schedule = kist_scheduler_schedule;
-    kist_scheduler->run = kist_scheduler_run;
-    kist_scheduler->on_new_options = kist_scheduler_on_new_options;
-  }
-  return kist_scheduler;
+  return &kist_scheduler;
 }
 
 /* Check the torrc for the configured KIST scheduler run interval.

+ 12 - 15
src/or/scheduler_vanilla.c

@@ -17,9 +17,6 @@
 /* Maximum cells to flush in a single call to channel_flush_some_cells(); */
 #define MAX_FLUSH_CELLS 1000
 
-/* Stores the vanilla scheduler function pointers. */
-static scheduler_t *vanilla_scheduler = NULL;
-
 /*****************************************************************************
  * Externally called function implementations
  *****************************************************************************/
@@ -180,20 +177,20 @@ vanilla_scheduler_run(void)
             n_chans_before - n_chans_after, n_chans_before);
 }
 
+/* Stores the vanilla scheduler function pointers. */
+static scheduler_t vanilla_scheduler = {
+  .free_all = NULL,
+  .on_channel_free = NULL,
+  .init = NULL,
+  .on_new_consensus = NULL,
+  .schedule = vanilla_scheduler_schedule,
+  .run = vanilla_scheduler_run,
+  .on_new_options = NULL,
+};
+
 scheduler_t *
 get_vanilla_scheduler(void)
 {
-  if (!vanilla_scheduler) {
-    log_debug(LD_SCHED, "Initializing vanilla scheduler struct");
-    vanilla_scheduler = tor_malloc_zero(sizeof(*vanilla_scheduler));
-    vanilla_scheduler->free_all = NULL;
-    vanilla_scheduler->on_channel_free = NULL;
-    vanilla_scheduler->init = NULL;
-    vanilla_scheduler->on_new_consensus = NULL;
-    vanilla_scheduler->schedule = vanilla_scheduler_schedule;
-    vanilla_scheduler->run = vanilla_scheduler_run;
-    vanilla_scheduler->on_new_options = NULL;
-  }
-  return vanilla_scheduler;
+  return &vanilla_scheduler;
 }
 

+ 2 - 2
src/test/test_scheduler.c

@@ -408,7 +408,7 @@ perform_channel_state_tests(int KISTSchedRunInterval)
    * Disable scheduler_run so we can just check the state transitions
    * without having to make everything it might call work too.
    */
-  the_scheduler->run = scheduler_run_noop_mock;
+  ((scheduler_t *) the_scheduler)->run = scheduler_run_noop_mock;
 
   tt_int_op(smartlist_len(channels_pending), OP_EQ, 0);
 
@@ -617,7 +617,7 @@ test_scheduler_loop_vanilla(void *arg)
    * without having to make everything it might call work too.
    */
   run_func_ptr = the_scheduler->run;
-  the_scheduler->run = scheduler_run_noop_mock;
+  ((scheduler_t *) the_scheduler)->run = scheduler_run_noop_mock;
 
   tt_int_op(smartlist_len(channels_pending), OP_EQ, 0);