diff options
Diffstat (limited to 'sys/kern/kern_sched.c')
-rw-r--r-- | sys/kern/kern_sched.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index 1d79937..6d85330 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -140,6 +140,38 @@ this_td(void) return ci->curtd; } +static inline void +td_pri_raise(struct proc *td) +{ + if (td->priority > 0) { + td->priority--; + } +} + +static inline void +td_pri_lower(struct proc *td) +{ + if (td->priority < SCHED_NQUEUE - 1) { + td->priority++; + } +} + +static inline void +td_pri_update(struct proc *td) +{ + switch (policy) { + case SCHED_POLICY_MLFQ: + if (td->rested) { + td->rested = false; + td_pri_raise(td); + } else { + td_pri_lower(td); + } + + break; + } +} + /* * Perform a context switch. */ @@ -154,6 +186,10 @@ sched_switch(struct trapframe *tf) ci = this_cpu(); td = ci->curtd; + if (td != NULL) { + td_pri_update(td); + } + /* * Get the next thread and use it only if it isn't * in the middle of an exit, exec, or whatever. @@ -205,6 +241,19 @@ sched_enter(void) } void +sched_yield(void) +{ + struct proc *td = this_td(); + + if (td != NULL) { + td->rested = true; + } + + sched_oneshot(false); + while (td->rested); +} + +void sched_init(void) { /* Setup the queues */ |