package schedularSimulator;
import java.util.PriorityQueue;
public class RateMonotonicEvent extends Event implements EventInterface {
RateMonotonicEvent(int time_,PriorityQueue<Task> task_list_) {
task_list = task_list_;
time = time_;
}
public void exec(PriorityQueue<Event>event_list,int quantum) {
// task が優先度順に並んでいるとする
// 再投入を先にチェックして、一番短いquantumを見つける
for(Task q: task_list) {
if (q.type!='p') continue;
// もし、再投入時間ならば再投入する
if (q.next_time==PeriodicalRun.task_clock) {
q.next_time=PeriodicalRun.task_clock+q.period;
// 次の再投入イベントをスケジューリングする
event_list.add(new RateMonotonicEvent(q.next_time,task_list));
if (quantum==0 || quantum > q.period) quantum = q.period;
if (q.length>0) {
// length が残っていると言うことは、
// まだ、実行されてなかったということ
q.report_dead_line_miss();
}
q.length = q.task_length; // タスクの再投入
}
}
for(Task q: task_list) {
if (q.type!='p') continue;
if (q.length>0) {
// まだ、実行されてないtaskで、
// 一番優先順位が高いものを実行する
// task queue からは、取り除かない
quantum -= q.exec_task(quantum,task_list);
if (quantum <= 0)
return;
}
}
}
}