diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_sched.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index 30036c0..774ba71 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -258,8 +258,27 @@ sched_enter(void) void sched_yield(void) { + struct proc *td; + struct cpu_info *ci = this_cpu(); + + if ((td = ci->curtd) == NULL) { + return; + } + + td->rested = true; + + /* FIXME: Hang yielding when waited on */ + if (ISSET(td->flags, PROC_WAITED)) { + return; + } + + ci->curtd = NULL; md_inton(); sched_oneshot(false); + + md_hlt(); + md_intoff(); + ci->curtd = td; } void |