diff --git a/kernel/src/sys/exit.cpp b/kernel/src/sys/exit.cpp index 3f05ee50..ee49c84e 100644 --- a/kernel/src/sys/exit.cpp +++ b/kernel/src/sys/exit.cpp @@ -7,7 +7,10 @@ Result sys_exit(Registers*, SyscallArgs args) Thread* current = Scheduler::current(); - Scheduler::for_each_child((pid_t)current->id, [](Thread* child) { child->parent_id = 1; }); + Scheduler::for_each_child((pid_t)current->id, [](Thread* child) { + child->parent_id = 1; + return true; + }); current->status = status; current->state = ThreadState::Exited; diff --git a/kernel/src/thread/Scheduler.cpp b/kernel/src/thread/Scheduler.cpp index cd40975c..c16c2561 100644 --- a/kernel/src/thread/Scheduler.cpp +++ b/kernel/src/thread/Scheduler.cpp @@ -249,12 +249,13 @@ namespace Scheduler g_current->ticks_left--; - g_threads.for_each([](Thread* thread) { + for (auto* const thread : g_threads) + { if (thread->state == ThreadState::Sleeping) { if (--thread->sleep_ticks_left == 0) thread->state = ThreadState::Runnable; } - }); + } if (!g_current->ticks_left) switch_task(regs); } @@ -276,20 +277,22 @@ namespace Scheduler Option find_by_pid(pid_t pid) { - Option result; + for (auto* const thread : g_threads) + { + if (thread->id == (u64)pid && thread->state != ThreadState::Dying) return thread; + } - g_threads.for_each([&](Thread* thread) { - if (thread->id == (u64)pid && thread->state != ThreadState::Dying) result = thread; - }); - - return result; + return {}; } bool has_children(pid_t pid) { bool result { false }; - for_each_child(pid, [&](Thread*) { result = true; }); + for_each_child(pid, [&](Thread*) { + result = true; + return false; + }); return result; } @@ -299,7 +302,12 @@ namespace Scheduler Option result; for_each_child(pid, [&](Thread* child) { - if (!result.has_value() && child->state == ThreadState::Exited) result = child; + if (!result.has_value() && child->state == ThreadState::Exited) + { + result = child; + return false; + } + return true; }); return result; diff --git a/kernel/src/thread/Scheduler.h b/kernel/src/thread/Scheduler.h index 9f36479d..3e1f07fe 100644 --- a/kernel/src/thread/Scheduler.h +++ b/kernel/src/thread/Scheduler.h @@ -31,9 +31,14 @@ namespace Scheduler template void for_each_child(pid_t pid, Callback callback) { - g_threads.for_each([&](Thread* thread) { - if (thread->parent_id == (u64)pid) callback(thread); - }); + for (auto* const thread : g_threads) + { + if (thread->parent_id == (u64)pid) + { + bool should_continue = callback(thread); + if (!should_continue) return; + } + } } bool has_children(pid_t pid);