Complete rewrite of c3po for multicore
[akaros.git] / user / c3po / threads / sched_global_rr.c
1 /**
2  *
3  *  Basic Round Robin scheduling with single global queue
4  *
5  **/
6
7 #include "threadlib_internal.h"
8 #include "util.h"
9 #include <stdio.h>
10
11 #ifndef DEBUG_sched_global_rr_c
12 #undef debug
13 #define debug(...)
14 //#undef tdebug
15 //#define tdebug(...)
16 #endif
17
18
19 static pointer_list_t *runlist = NULL;
20
21
22 //////////////////////////////////////////////////////////////////////
23 // generic stuff
24 //////////////////////////////////////////////////////////////////////
25
26
27 void sched_global_generic_init(void)
28 {
29   runlist = new_pointer_list("sched_global_rr_runlist");
30 }
31
32 thread_t* sched_global_generic_next_thread(void) 
33 {
34   thread_t *next = pl_remove_head(runlist);
35   if( next == (thread_t*) -1 ) 
36     return NULL;
37   else 
38     return next;
39 }
40
41
42
43 //////////////////////////////////////////////////////////////////////
44 // Round robin scheduler
45 //////////////////////////////////////////////////////////////////////
46
47 strong_alias( sched_global_generic_init, sched_global_rr_init );
48 strong_alias( sched_global_generic_next_thread, sched_global_rr_next_thread );
49
50 void sched_global_rr_add_thread(thread_t *t)
51 {
52   pl_add_tail(runlist, t);
53 }
54
55
56 //////////////////////////////////////////////////////////////////////
57 // LIFO scheduler
58 //////////////////////////////////////////////////////////////////////
59
60 strong_alias( sched_global_generic_init, sched_global_lifo_init );
61 strong_alias( sched_global_generic_next_thread, sched_global_lifo_next_thread );
62
63 void sched_global_lifo_add_thread(thread_t *t)
64 {
65   pl_add_head(runlist, t);
66 }
67