- 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--;
-
- 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--;
+ if (avail_threads == 0 && !execution->getFuzzer()->has_paused_threads()) {
+ if (sleep_threads != 0) {
+ // No threads available, but some threads sleeping. Wake up one of them
+ thread = execution->getFuzzer()->selectThread(sleep_list, sleep_threads);
+ remove_sleep(thread);
+ thread->set_wakeup_state(true);
+ } else {
+ return NULL; // No threads available and no threads sleeping.