From 974d7ce527c9220fcdad44b27b4a2b44054502c2 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 30 Jun 2024 23:37:33 -0400 Subject: kernel: sched: Add exit1() Signed-off-by: Ian Moffett --- sys/kern/kern_sched.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'sys/kern/kern_sched.c') diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index f1bd067..9df541e 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -130,15 +131,30 @@ sched_switch(struct trapframe *tf) struct cpu_info *ci; struct pcb *pcbp; struct proc *next_td, *td; + bool use_current = true; + bool inexec; ci = this_cpu(); td = ci->curtd; - /* Do we have threads to switch to? */ - if ((next_td = sched_dequeue_td()) == NULL) { - sched_oneshot(false); - return; - } + /* + * Get the next thread and use it only if it isn't + * in the middle of an exit, exec, or whatever. + */ + do { + if ((next_td = sched_dequeue_td()) == NULL) { + sched_oneshot(false); + return; + } + + /* + * Don't use this thread if we are currently + * exiting. + */ + if (ISSET(next_td->flags, PROC_EXITING)) { + use_current = false; + } + } while (!use_current); /* Re-enqueue the old thread */ if (td != NULL) { -- cgit v1.2.3