summaryrefslogtreecommitdiff
path: root/sys/kern/kern_sched.c
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2024-06-30 23:37:33 -0400
committerIan Moffett <ian@osmora.org>2024-06-30 23:39:37 -0400
commit974d7ce527c9220fcdad44b27b4a2b44054502c2 (patch)
treeea1b0334915c38bdeec7109fb2c73825925e0729 /sys/kern/kern_sched.c
parentb947d0c149dd3a36d92343a41a80a6b3f29f5f00 (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.c26
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) {