package mvd.jester.tests; import java.util.HashMap; import java.util.Map; import java.util.Set; import mvd.jester.info.SchedulingInfo; import mvd.jester.info.TerminationInfo; import mvd.jester.model.DagTask; import mvd.jester.model.SortedTaskSet; import mvd.jester.model.SystemManagerInterface; import mvd.jester.model.Task; import mvd.jester.priority.PriorityManager; import mvd.jester.priority.RateMonotonic; /** * SchmidMottok */ public class SchmidMottok extends AbstractTest { private final Map responseTimes; private final PriorityManager priorityManager; private final TypeFunction structure; public SchmidMottok(TypeFunction structure, final SystemManagerInterface manager) { super(manager); this.responseTimes = new HashMap<>(); this.priorityManager = new RateMonotonic(); this.structure = structure; } @Override public PriorityManager getPriorityManager() { return priorityManager; } @Override public SchedulingInfo runSchedulabilityCheck(final SortedTaskSet tasks) { responseTimes.clear(); for (final DagTask t : tasks) { final long responseTime = calculateResponseTime(tasks, t); responseTimes.put(t, new TerminationInfo(t.getDeadline(), responseTime)); } return new SchedulingInfo(responseTimes.values()); } @Override public String getName() { return "SchmidMottok" + "_" + structure.getType(); } private long calculateResponseTime(final Set tasks, final DagTask task) { final long minimumWcet = task.getCriticalPath(); long responseTime = minimumWcet; long previousResponseTime = 0; do { previousResponseTime = responseTime; double taskInterference = 0; for (final DagTask t : tasks) { if (t.getPeriod() < task.getPeriod()) { final long numberOfThreads = structure.getNumberOfThreads(t); for (int p = 0; p < numberOfThreads; ++p) { taskInterference += Math.min(structure.getTaskInterference(t, responseTimes, responseTime, p + 1), responseTime - minimumWcet + 1); } } } taskInterference /= manager.getNumberOfProcessors(); final double selfInterference = structure.getSelfInterference(task); final long totalInterference = (long) Math.floor(taskInterference + selfInterference); responseTime = minimumWcet + totalInterference; } while (previousResponseTime != responseTime); return responseTime; } }