From 440029c9d17726da9776f35e66da869e843e2faf Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 7 Nov 2018 22:24:20 +0100 Subject: [PATCH] Reduce number of passes in the scheduler by 2. --- Kernel/Process.cpp | 8 ++++++-- Kernel/Scheduler.cpp | 31 +++++++++++++++++-------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 912a6b97ab..bb8b9f099e 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -857,20 +857,24 @@ void Process::doHouseKeeping() void Process::for_each(Function callback) { ASSERT_INTERRUPTS_DISABLED(); - for (auto* process = g_processes->head(); process; process = process->next()) { + for (auto* process = g_processes->head(); process;) { + auto* next_process = process->next(); if (!callback(*process)) break; + process = next_process; } } void Process::for_each_in_pgrp(pid_t pgid, Function callback) { ASSERT_INTERRUPTS_DISABLED(); - for (auto* process = g_processes->head(); process; process = process->next()) { + for (auto* process = g_processes->head(); process;) { + auto* next_process = process->next(); if (process->pgid() == pgid) { if (!callback(*process)) break; } + process = next_process; } } diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index dbe045f8cb..338490f632 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -2,6 +2,7 @@ #include "Process.h" #include "system.h" +//#define LOG_EVERY_CONTEXT_SWITCH //#define SCHEDULER_DEBUG static const dword time_slice = 5; // *10 = 50ms @@ -48,22 +49,20 @@ bool Scheduler::pick_next() process.unblock(); return true; } - return true; - }); - // Forgive dead orphans. - // FIXME: Does this really make sense? - Process::for_each_in_state(Process::Dead, [] (auto& process) { - if (!Process::from_pid(process.ppid())) - process.set_state(Process::Forgiven); - return true; - }); + // Forgive dead orphans. + if (process.state() == Process::Dead) { + if (!Process::from_pid(process.ppid())) + process.set_state(Process::Forgiven); + } + + // Release the forgiven. + Process::for_each_in_state(Process::Forgiven, [] (auto& process) { + g_processes->remove(&process); + g_dead_processes->append(&process); + return true; + }); - // Clean up forgiven processes. - // FIXME: Do we really need this to be a separate pass over the process list? - Process::for_each_in_state(Process::Forgiven, [] (auto& process) { - g_processes->remove(&process); - g_dead_processes->append(&process); return true; }); @@ -178,6 +177,10 @@ bool Scheduler::context_switch(Process& process) // mark it as runnable for the next round. if (current->state() == Process::Running) current->set_state(Process::Runnable); + +#ifdef LOG_EVERY_CONTEXT_SWITCH + dbgprintf("Scheduler: %s(%u) -> %s(%u)\n", current->name().characters(), current->pid(), process.name().characters(), process.pid()); +#endif } current = &process;