瀏覽代碼

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!
         return; // TODO: This prevents scheduling on other CPUs!
 #endif
 #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())
     if (current_thread->tick())
         return;
         return;