#include <defs.h>
|
|
#include <list.h>
|
|
#include <proc.h>
|
|
#include <assert.h>
|
|
#include <default_sched.h>
|
|
|
|
static void
|
|
RR_init(struct run_queue *rq) {
|
|
list_init(&(rq->run_list));
|
|
rq->proc_num = 0;
|
|
}
|
|
|
|
static void
|
|
RR_enqueue(struct run_queue *rq, struct proc_struct *proc) {
|
|
assert(list_empty(&(proc->run_link)));
|
|
list_add_before(&(rq->run_list), &(proc->run_link));
|
|
if (proc->time_slice == 0 || proc->time_slice > rq->max_time_slice) {
|
|
proc->time_slice = rq->max_time_slice;
|
|
}
|
|
proc->rq = rq;
|
|
rq->proc_num ++;
|
|
}
|
|
|
|
static void
|
|
RR_dequeue(struct run_queue *rq, struct proc_struct *proc) {
|
|
assert(!list_empty(&(proc->run_link)) && proc->rq == rq);
|
|
list_del_init(&(proc->run_link));
|
|
rq->proc_num --;
|
|
}
|
|
|
|
static struct proc_struct *
|
|
RR_pick_next(struct run_queue *rq) {
|
|
list_entry_t *le = list_next(&(rq->run_list));
|
|
if (le != &(rq->run_list)) {
|
|
return le2proc(le, run_link);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static void
|
|
RR_proc_tick(struct run_queue *rq, struct proc_struct *proc) {
|
|
if (proc->time_slice > 0) {
|
|
proc->time_slice --;
|
|
}
|
|
if (proc->time_slice == 0) {
|
|
proc->need_resched = 1;
|
|
}
|
|
}
|
|
|
|
struct sched_class default_sched_class = {
|
|
.name = "RR_scheduler",
|
|
.init = RR_init,
|
|
.enqueue = RR_enqueue,
|
|
.dequeue = RR_dequeue,
|
|
.pick_next = RR_pick_next,
|
|
.proc_tick = RR_proc_tick,
|
|
};
|
|
|