From b919789db24cbeb323a694989ca784c43fff9acc Mon Sep 17 00:00:00 2001 From: Tom Date: Tue, 13 Jul 2021 11:44:30 -0600 Subject: [PATCH] Kernel: Kill user mode threads that are marked to die Threads that don't make syscalls still need to be killed, and we can do that at any time we want so long the thread is in user mode and not somehow blocked (e.g. page fault). --- Kernel/Scheduler.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index da69b27cd7..ef3e702aca 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -443,6 +443,16 @@ void Scheduler::timer_tick(const RegisterState& regs) return; // TODO: This prevents scheduling on other CPUs! #endif + if (current_thread->previous_mode() == Thread::PreviousMode::UserMode && current_thread->should_die() && !current_thread->is_blocked()) { + dbgln_if(SCHEDULER_DEBUG, "Scheduler[{}]: Terminating user mode thread {}", Processor::id(), *current_thread); + { + ScopedSpinLock scheduler_lock(g_scheduler_lock); + current_thread->set_state(Thread::Dying); + } + VERIFY(!Processor::current().in_critical()); + Processor::current().invoke_scheduler_async(); + return; + } if (current_thread->tick()) return;