/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.backend.java.scheduling;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Logger;
import abs.backend.java.lib.runtime.Logging;
import abs.backend.java.lib.types.ABSProcess;
import abs.backend.java.scheduling.SimpleTaskScheduler.TaskInfo;
import abs.common.ListUtils;
public abstract class UserSchedulingStrategy implements TaskSchedulingStrategy {
private final static Logger logger = Logging.getLogger(UserSchedulingStrategy.class.getName());
@Override
public synchronized TaskInfo schedule(final TaskScheduler scheduler, final List<TaskInfo> schedulableTasks) {
System.out.println(scheduler.getCOG().toString() + " Scheduling (" + schedulableTasks.size() + " processes in queue)...");
// Remember TaskInfos based on their Pids to speed things up a little
HashMap<Integer, TaskInfo> taskMap = new HashMap<Integer, TaskInfo>();
// Convert List<TaskInfo> to ArrayList<ABSProcess>
ArrayList<ABSProcess> processes = new ArrayList<ABSProcess>();
for (TaskInfo taskInfo : schedulableTasks) {
taskMap.put(taskInfo.task.getID(), taskInfo);
// TODO set: pid, method, arrival, cost, deadline, start, finish, critical, value
ABSProcess proc = new ABSProcess(
taskInfo.task.getID(), //Or use taskInfo.id (long)??
taskInfo.task.getCall().methodName(),
taskInfo.task.getArrival(),
taskInfo.task.getCost(),
taskInfo.task.getDeadline(),
taskInfo.task.getStart(),
taskInfo.task.getFinish(),
taskInfo.task.isCritical(),
taskInfo.task.getValue());
processes.add(proc);
}
logger.info(processes.toString());
// Convert ArryList<ABSProcess> to ABS.StdLib.List of ABSProcess
final Object queue = ListUtils.toABSList(processes);
ABSProcess result = userschedule(queue);
// Convert returned ABSValue (actually an ABSProcess) to TaskInfo
int selectedPid = result.getPid();
logger.info("scheduling Task " + selectedPid);
return taskMap.get(selectedPid);
}
// to be implemented by the generated subclass
protected abstract ABSProcess userschedule(final Object queue);
}