aboutsummaryrefslogtreecommitdiff
path: root/src/or/scheduler.c
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2017-09-14 13:23:43 -0400
committerDavid Goulet <dgoulet@torproject.org>2017-09-15 11:40:59 -0400
commit7cc9621d115303ab71d8cf8e49f5dfe428636145 (patch)
treedb1904c51fdf33bb7184c4c20c413045898e98b4 /src/or/scheduler.c
parent6ff8c86ac663914901b4ea9ce64c20b59bec6011 (diff)
downloadtor-7cc9621d115303ab71d8cf8e49f5dfe428636145.tar.gz
tor-7cc9621d115303ab71d8cf8e49f5dfe428636145.zip
sched: Add Schedulers torrc option
This option is a list of possible scheduler type tor can use ordered by priority. Its default value is "KIST,KISTLite,Vanilla" which means that KIST will be used first and if unavailable will fallback to KISTLite and so on. Signed-off-by: David Goulet <dgoulet@torproject.org>
Diffstat (limited to 'src/or/scheduler.c')
-rw-r--r--src/or/scheduler.c57
1 files changed, 45 insertions, 12 deletions
diff --git a/src/or/scheduler.c b/src/or/scheduler.c
index 8e4cec095e..aaf991407a 100644
--- a/src/or/scheduler.c
+++ b/src/or/scheduler.c
@@ -274,6 +274,48 @@ scheduler_compare_channels, (const void *c1_v, const void *c2_v))
* Functions that can be accessed from anywhere in Tor.
*****************************************************************************/
+/* Using the global options, select the scheduler we should be using. */
+static void
+select_scheduler(void)
+{
+ const char *chosen_sched_type = NULL;
+
+ /* This list is ordered that is first entry has the first priority. Thus, as
+ * soon as we find a scheduler type that we can use, we use it and stop. */
+ SMARTLIST_FOREACH_BEGIN(get_options()->SchedulerTypes_, int *, type) {
+ switch (*type) {
+ case SCHEDULER_VANILLA:
+ the_scheduler = get_vanilla_scheduler();
+ chosen_sched_type = "Vanilla";
+ goto end;
+ case SCHEDULER_KIST:
+ if (!scheduler_can_use_kist()) {
+ log_warn(LD_SCHED, "Scheduler KIST can't be used. Consider removing "
+ "it from Schedulers or if you have a tor built "
+ "with KIST support, you should make sure "
+ "KISTSchedRunInterval is a non zero value");
+ continue;
+ }
+ the_scheduler = get_kist_scheduler();
+ chosen_sched_type = "KIST";
+ scheduler_kist_set_full_mode();
+ goto end;
+ case SCHEDULER_KIST_LITE:
+ chosen_sched_type = "KISTLite";
+ the_scheduler = get_kist_scheduler();
+ scheduler_kist_set_lite_mode();
+ goto end;
+ default:
+ /* Our option validation should have caught this. */
+ tor_assert_unreached();
+ }
+ } SMARTLIST_FOREACH_END(type);
+
+ end:
+ log_notice(LD_CONFIG, "Scheduler type %s has been enabled.",
+ chosen_sched_type);
+}
+
/*
* Little helper function called from a few different places. It changes the
* scheduler implementation, if necessary. And if it did, it then tells the
@@ -282,17 +324,10 @@ scheduler_compare_channels, (const void *c1_v, const void *c2_v))
static void
set_scheduler(void)
{
- int have_kist = 0;
-
- /* Switch, if needed */
scheduler_t *old_scheduler = the_scheduler;
- if (scheduler_should_use_kist()) {
- the_scheduler = get_kist_scheduler();
- have_kist = 1;
- } else {
- the_scheduler = get_vanilla_scheduler();
- }
- tor_assert(the_scheduler);
+
+ /* From the options, select the scheduler type to set. */
+ select_scheduler();
if (old_scheduler != the_scheduler) {
/* Allow the old scheduler to clean up, if needed. */
@@ -306,8 +341,6 @@ set_scheduler(void)
if (the_scheduler->init) {
the_scheduler->init();
}
- log_notice(LD_CONFIG, "Using the %s scheduler.",
- have_kist ? "KIST" : "vanilla");
}
}