ソースを参照

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).
Tom 4 年 前
コミット
b919789db2
1 ファイル変更10 行追加0 行削除
  1. 10 0
      Kernel/Scheduler.cpp

+ 10 - 0
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;