- while (true) {
- curr_thread_index = (curr_thread_index + 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))) {
- t = model->get_thread(curr_tid);
- break;
- }
- if (curr_thread_index == old_curr_thread) {
- if (DBG_ENABLED())
- print();
- return NULL;
- }
+ for (int i = 0; i < enabled_len; i++) {
+ if (enabled[i] == THREAD_ENABLED)
+ thread_list[avail_threads++] = i;
+ else if (enabled[i] == THREAD_SLEEP_SET)
+ sleep_list[sleep_threads++] = i;
+ }
+
+ 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.