-Thread * Scheduler::next_thread(Thread *t)
-{
- if ( t == NULL ) {
- int old_curr_thread = curr_thread_index;
- while(true) {
- curr_thread_index = (curr_thread_index+1) % enabled_len;
- if (enabled[curr_thread_index]==THREAD_ENABLED) {
- t = model->get_thread(int_to_id(curr_thread_index));
- break;
- }
- if (curr_thread_index == old_curr_thread) {
- print();
- return NULL;
- }
+Thread * Scheduler::select_next_thread()
+{
+ int old_curr_thread = curr_thread_index;
+ bool have_enabled_thread_with_priority = false;
+ Node *n = model->get_curr_node();
+
+ for (int i = 0; i < enabled_len; i++) {
+ thread_id_t tid = int_to_id(i);
+ if (n->has_priority(tid)) {
+ DEBUG("Node (tid %d) has priority\n", i);
+ if (enabled[i] != THREAD_DISABLED)
+ have_enabled_thread_with_priority = true;
+ }
+ }
+
+ for (int i = 0; i < enabled_len; i++) {
+ curr_thread_index = (old_curr_thread + i + 1) % enabled_len;
+ thread_id_t curr_tid = int_to_id(curr_thread_index);
+ if (enabled[curr_thread_index] == THREAD_ENABLED &&
+ (!have_enabled_thread_with_priority || n->has_priority(curr_tid))) {
+ return model->get_thread(curr_tid);