package schedularSimulator;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
public class PeriodicalRun {
int quantum = 0;
static final int BUFSIZ = 4096;
int task_count;
static int task_clock = 0;
static final int limit = 400;
/*
標準入力から与えられたタスクのデータを読み込み、
task のqueue を作成して、 run で実行する。
# type[n/p] clock taskname task-size priority [period]
n 0 a 110 5
n non-periodic
p periodic
*/
public static void
main(String []args) throws FileNotFoundException
{
PeriodicalRun self = new PeriodicalRun();
self.task_init(args);
}
/*
task の sort 用の関数
*/
class by_period implements Comparator<Task> {
public int compare(Task q,Task r)
{
return q.period==r.period?0:q.period > r.period?1:-1;
}
}
/*
event の sort 用の関数
*/
class by_time implements Comparator<Event> {
public int compare(Event q,Event r)
{
return q.time==r.time?0:q.time > r.time?1:-1;
}
}
public void task_init(String [] args) throws FileNotFoundException
{
int time; String name; int length; int priority;
int period;
Comparator<Task> comp = new by_period();
PriorityQueue<Task> task_list = new PriorityQueue<Task>(1024,comp) ;
Comparator<Event> comp1 = new by_time();
PriorityQueue<Event> event_list = new PriorityQueue<Event>(1024,comp1) ;
Task q;
char type;
File from = new File(args[0]);
Scanner scanner = new Scanner(from);
scanner.useDelimiter("\\s+");
task_count = 0;
while(scanner.hasNext()) {
try {
char top = scanner.next().charAt(0);
if (top=='#'||top!='p') {
scanner.nextLine();
continue;
}
type = 'p'; // scanner.next().charAt(0); System.out.println("type= "+type);
time = scanner.nextInt(); // System.out.println("time= "+time);
name = scanner.next(); // System.out.println("name= "+name);
length = scanner.nextInt(); // System.out.println("length= "+length);
priority = scanner.nextInt(); // System.out.println("priority= "+priority);
period = scanner.nextInt(); // System.out.println("period= "+period);
q = new Task(name, length, priority, period);
q.type = type;
task_list.add(q);
task_count++;
} catch ( java.util.InputMismatchException e) {
System.out.print("task list syntax error on ");
System.out.println(
scanner.nextLine()); continue;
}
scanner.nextLine();
}
event_list.add(new RateMonotonicEvent(0,task_list));
run(event_list);
Task.report();
}
void
run(PriorityQueue<Event> event_list)
{
while(!event_list.isEmpty()) {
Event event = event_list.poll();
task_clock = event.time;
if (limit >0 && task_clock>limit) {
break;
}
Event next =event_list.peek();
int quantum = (next==null)?0:next.time-task_clock;
event.exec(event_list,quantum);
}
}
}