summaryrefslogtreecommitdiff
path: root/sys/kern/kern_sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_sched.c')
-rw-r--r--sys/kern/kern_sched.c17
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