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