#include "schedule.h"
#include "common.h"
#include "model.h"
-#include "nodestack.h"
#include "execution.h"
+#include "fuzzer.h"
/**
* Format an "enabled_type_t" for printing
enabled_len = threadid + 1;
}
enabled[threadid] = enabled_status;
- if (enabled_status == THREAD_DISABLED)
- execution->check_promises_thread_disabled();
}
/**
bool Scheduler::all_threads_sleeping() const
{
bool sleeping = false;
- for (int i = 0; i < enabled_len; i++)
+ for (int i = 0;i < enabled_len;i++)
if (enabled[i] == THREAD_ENABLED)
return false;
else if (enabled[i] == THREAD_SLEEP_SET)
/**
* @brief Select a Thread to run via round-robin
*
- * @param n The current Node, holding priority information for the next thread
- * selection
*
* @return The next Thread to run
*/
-Thread * Scheduler::select_next_thread(Node *n)
+Thread * Scheduler::select_next_thread()
{
- bool have_enabled_thread_with_priority = false;
- if (model->params.fairwindow != 0) {
- 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;
- }
- }
- }
-
- int avail_threads = enabled_len; // number of available threads
- int thread_list[enabled_len]; // keep a list of threads to select from
- for (int i = 0; i< enabled_len; i++){
- thread_list[i] = i;
+ int avail_threads = 0;
+ int thread_list[enabled_len];
+ for (int i = 0;i< enabled_len;i++) {
+ if (enabled[i] == THREAD_ENABLED)
+ thread_list[avail_threads++] = i;
}
- while (avail_threads > 0) {
- int random_index = rand() % avail_threads;
- curr_thread_index = thread_list[random_index]; // randomly select a thread from available threads
-
- // curr_thread_index = (curr_thread_index + i + 1) % enabled_len;
- thread_id_t curr_tid = int_to_id(curr_thread_index);
- if (model->params.yieldon) {
- bool bad_thread = false;
- for (int j = 0; j < enabled_len; j++) {
- thread_id_t tother = int_to_id(j);
- if ((enabled[j] != THREAD_DISABLED) && n->has_priority_over(curr_tid, tother)) {
- bad_thread=true;
- break;
- }
- }
- if (bad_thread) {
- thread_list[random_index] = thread_list[avail_threads - 1]; // remove this threads from available threads
- avail_threads--;
+ if (avail_threads == 0)
+ return NULL;// No threads availablex
- continue;
- }
- }
-
- if (enabled[curr_thread_index] == THREAD_ENABLED &&
- (!have_enabled_thread_with_priority || n->has_priority(curr_tid))) {
- return model->get_thread(curr_tid);
- } else { // remove this threads from available threads
- thread_list[random_index] = thread_list[avail_threads - 1];
- avail_threads--;
- }
- }
-
- /* No thread was enabled */
- return NULL;
+ Thread * thread = execution->getFuzzer()->selectThread(thread_list, avail_threads);
+ curr_thread_index = id_to_int(thread->get_id());
+ return thread;
}
void Scheduler::set_scheduler_thread(thread_id_t tid) {
int curr_id = current ? id_to_int(current->get_id()) : -1;
model_print("Scheduler: ");
- for (int i = 0; i < enabled_len; i++) {
+ for (int i = 0;i < enabled_len;i++) {
char str[20];
enabled_type_to_string(enabled[i], str);
model_print("[%i: %s%s]", i, i == curr_id ? "current, " : "", str);