diff options
author | Ian Moffett <ian@osmora.org> | 2025-05-31 01:46:27 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-05-31 01:52:50 -0400 |
commit | 8aaa6cc38ae8f2fde486afcac6f9e40dd832a468 (patch) | |
tree | e24144f2b072a7253513b235c104a74bd6fd8551 /sys/kern/kern_sched.c | |
parent | d3d30751c49cadf015c4ebb5eaebe6dcefd982b4 (diff) |
kernel: proc: Add PROC_SLEEP to pause threads
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/kern/kern_sched.c')
-rw-r--r-- | sys/kern/kern_sched.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index 65e08d7..c074f75 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -104,12 +104,22 @@ sched_dequeue_td(void) for (size_t i = 0; i < SCHED_NQUEUE; ++i) { queue = &qlist[i]; - if (!TAILQ_EMPTY(&queue->q)) { - td = TAILQ_FIRST(&queue->q); - TAILQ_REMOVE(&queue->q, td, link); - spinlock_release(&tdq_lock); - return td; + if (TAILQ_EMPTY(&queue->q)) { + continue; } + + td = TAILQ_FIRST(&queue->q); + if (td == NULL) { + continue; + } + + TAILQ_REMOVE(&queue->q, td, link); + if (ISSET(td->flags, PROC_SLEEP)) { + continue; + } + + spinlock_release(&tdq_lock); + return td; } /* We got nothing */ @@ -125,6 +135,10 @@ sched_enqueue_td(struct proc *td) { struct sched_queue *queue; + if (ISSET(td->flags, PROC_SLEEP)) { + return; + } + spinlock_acquire(&tdq_lock); queue = &qlist[td->priority]; |