diff options
author | Ian Moffett <ian@osmora.org> | 2024-06-30 23:37:33 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2024-06-30 23:39:37 -0400 |
commit | 974d7ce527c9220fcdad44b27b4a2b44054502c2 (patch) | |
tree | ea1b0334915c38bdeec7109fb2c73825925e0729 /sys/kern/kern_sched.c | |
parent | b947d0c149dd3a36d92343a41a80a6b3f29f5f00 (diff) |
kernel: sched: Add exit1()
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/kern/kern_sched.c')
-rw-r--r-- | sys/kern/kern_sched.c | 26 |
1 files changed, 21 insertions, 5 deletions
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 <sys/sched.h> #include <sys/schedvar.h> #include <sys/cdefs.h> +#include <sys/param.h> #include <sys/syslog.h> #include <machine/frame.h> #include <machine/cpu.h> @@ -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) { |