}
/**
- * Select a Thread to run and set it as the 'current' Thread. This
- * implementation defaults to round-robin
- *
+ * @brief Select a Thread to run via round-robin
* @return The next Thread to run
*/
Thread * Scheduler::select_next_thread()
thread_id_t tid = int_to_id(i);
if (n->has_priority(tid)) {
DEBUG("Node (tid %d) has priority\n", i);
- //Have a thread with priority
if (enabled[i] != THREAD_DISABLED)
have_enabled_thread_with_priority = true;
}
}
- while (true) {
- curr_thread_index = (curr_thread_index + 1) % enabled_len;
+ 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))) {
- current = model->get_thread(curr_tid);
- if (DBG_ENABLED())
- print();
- return current;
- }
- if (curr_thread_index == old_curr_thread) {
- if (DBG_ENABLED())
- print();
- return NULL;
+ return model->get_thread(curr_tid);
}
}
+ /* No thread was enabled */
+ return NULL;
+}
+
+void Scheduler::set_scheduler_thread(thread_id_t tid) {
+ curr_thread_index=id_to_int(tid);
}
/**
{
ASSERT(t && !t->is_model_thread());
- curr_thread_index = id_to_int(t->get_id());
-
current = t;
if (DBG_ENABLED())
print();