another example
[model-checker.git] / schedule.cc
1 #include "threads.h"
2 #include "schedule.h"
3 #include "common.h"
4 #include "model.h"
5
6 /** Constructor */
7 Scheduler::Scheduler() :
8         current(NULL)
9 {
10 }
11
12 /**
13  * Add a Thread to the scheduler's ready list.
14  * @param t The Thread to add
15  */
16 void Scheduler::add_thread(Thread *t)
17 {
18         DEBUG("thread %d\n", t->get_id());
19         readyList.push_back(t);
20 }
21
22 /**
23  * Remove a given Thread from the scheduler.
24  * @param t The Thread to remove
25  */
26 void Scheduler::remove_thread(Thread *t)
27 {
28         if (current == t)
29                 current = NULL;
30         else
31                 readyList.remove(t);
32 }
33
34 /**
35  * Remove one Thread from the scheduler. This implementation defaults to FIFO,
36  * if a thread is not already provided.
37  *
38  * @param t Thread to run, if chosen by an external entity (e.g.,
39  * ModelChecker). May be NULL to indicate no external choice.
40  * @return The next Thread to run
41  */
42 Thread * Scheduler::next_thread(Thread *t)
43 {
44         if (t != NULL) {
45                 current = t;
46                 readyList.remove(t);
47         } else if (readyList.empty()) {
48                 t = NULL;
49         } else {
50                 t = readyList.front();
51                 current = t;
52                 readyList.pop_front();
53         }
54
55         print();
56
57         return t;
58 }
59
60 /**
61  * @return The currently-running Thread
62  */
63 Thread * Scheduler::get_current_thread() const
64 {
65         return current;
66 }
67
68 /**
69  * Print debugging information about the current state of the scheduler. Only
70  * prints something if debugging is enabled.
71  */
72 void Scheduler::print() const
73 {
74         if (current)
75                 DEBUG("Current thread: %d\n", current->get_id());
76         else
77                 DEBUG("No current thread\n");
78         DEBUG("Num. threads in ready list: %zu\n", readyList.size());
79
80         std::list<Thread *, MyAlloc< Thread * > >::const_iterator it;
81         for (it = readyList.begin(); it != readyList.end(); it++)
82                 DEBUG("In ready list: thread %d\n", (*it)->get_id());
83 }