1 /* 2 * Copyright 2008-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #include <kscheduler.h> 7 #include <listeners.h> 8 #include <smp.h> 9 10 #include "scheduler_affine.h" 11 #include "scheduler_simple.h" 12 13 // Defines which scheduler(s) to use. Possible values: 14 // 0 - Auto-select scheduler based on detected core count 15 // 1 - Always use the simple scheduler 16 // 2 - Always use the affine scheduler 17 #define SCHEDULER_TYPE 1 18 19 struct scheduler_ops* gScheduler; 20 SchedulerListenerList gSchedulerListeners; 21 22 23 SchedulerListener::~SchedulerListener() 24 { 25 } 26 27 28 /*! Add the given scheduler listener. Thread lock must be held. 29 */ 30 void 31 scheduler_add_listener(struct SchedulerListener* listener) 32 { 33 gSchedulerListeners.Add(listener); 34 } 35 36 37 /*! Remove the given scheduler listener. Thread lock must be held. 38 */ 39 void 40 scheduler_remove_listener(struct SchedulerListener* listener) 41 { 42 gSchedulerListeners.Remove(listener); 43 } 44 45 46 void 47 scheduler_init(void) 48 { 49 int32 cpu_count = smp_get_num_cpus(); 50 dprintf("scheduler_init: found %ld logical cpus\n", cpu_count); 51 #if SCHEDULER_TYPE == 0 52 if (cpu_count > 1) { 53 dprintf("scheduler_init: using affine scheduler\n"); 54 scheduler_affine_init(); 55 } else { 56 dprintf("scheduler_init: using simple scheduler\n"); 57 scheduler_simple_init(); 58 } 59 #elif SCHEDULER_TYPE == 1 60 scheduler_simple_init(); 61 #elif SCHEDULER_TYPE == 2 62 scheduler_affine_init(); 63 #endif 64 65 #if SCHEDULER_TRACING 66 add_debugger_command_etc("scheduler", &cmd_scheduler, 67 "Analyze scheduler tracing information", 68 "<thread>\n" 69 "Analyzes scheduler tracing information for a given thread.\n" 70 " <thread> - ID of the thread.\n", 0); 71 #endif 72 } 73