diff options
Diffstat (limited to 'sys/kern/kern_sched.c')
-rw-r--r-- | sys/kern/kern_sched.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index 4bbe5a0..8e5c0e9 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -185,7 +185,7 @@ sched_switch(struct trapframe *tf) struct cpu_info *ci; struct pcb *pcbp; struct proc *next_td, *td; - bool use_current = true; + bool use_current; ci = this_cpu(); td = ci->curtd; @@ -200,6 +200,7 @@ sched_switch(struct trapframe *tf) * in the middle of an exit, exec, or whatever. */ do { + use_current = true; if ((next_td = sched_dequeue_td()) == NULL) { sched_oneshot(false); return; @@ -256,10 +257,20 @@ sched_yield(void) if (td != NULL) { td->rested = true; + sched_switch(&td->tf); } +} - sched_oneshot(false); - while (td->rested); +void +sched_detach(struct proc *td) +{ + struct sched_queue *queue; + + spinlock_acquire(&tdq_lock); + queue = &qlist[td->priority]; + + TAILQ_REMOVE(&queue->q, td, link); + spinlock_release(&tdq_lock); } void |