xref: /haiku/src/system/kernel/scheduler/scheduler.cpp (revision b9068dbf95e05818c251ab36f8cb1d8619d2c9be)
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