diff --git a/kernel/include/thread/Scheduler.h b/kernel/include/thread/Scheduler.h index 559d6a61..24ab7789 100644 --- a/kernel/include/thread/Scheduler.h +++ b/kernel/include/thread/Scheduler.h @@ -29,4 +29,6 @@ namespace Scheduler void reset_task(Task* task, ELFImage* new_image); void append_task(Task* task); + + Task* find_by_pid(uint64_t pid); } \ No newline at end of file diff --git a/kernel/src/thread/Scheduler.cpp b/kernel/src/thread/Scheduler.cpp index a1690d84..17493c6d 100644 --- a/kernel/src/thread/Scheduler.cpp +++ b/kernel/src/thread/Scheduler.cpp @@ -33,6 +33,31 @@ extern "C" void idle_task_function(); static uint64_t frequency; +template void sched_for_each_task(Callback callback) +{ + Task* task = base_task; + if (!task) return; + do { + bool will_continue = callback(task); + if (!will_continue) break; + task = task->next_task; + } while (task != base_task); +} + +Task* Scheduler::find_by_pid(uint64_t pid) +{ + Task* result = nullptr; + sched_for_each_task([&](Task* task) { + if (task->id == pid) + { + result = task; + return false; + } + return true; + }); + return result; +} + void Scheduler::append_task(Task* task) { if (!base_task) @@ -295,17 +320,15 @@ void Scheduler::reap_tasks() static void sched_decrement_sleep_times() { - Task* task = base_task; - if (!task) return; - do { + sched_for_each_task([](Task* task) { if (task->task_sleep > 0) { task->task_sleep -= frequency; if (task->task_sleep < 0) task->task_sleep = 0; } if (task->task_sleep == 0 && task->state == task->Sleeping) task->state = task->Running; - task = task->next_task; - } while (task != base_task); + return true; + }); } void Scheduler::task_tick(Context* context)