package lbms.plugins.mldht.kad; import java.util.ArrayList; import java.util.Deque; import java.util.List; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; /** * Manages all dht tasks. * * @author Damokles */ public class TaskManager { private Map<Integer, Task> tasks; private Deque<Task> queued; private int next_id; public TaskManager () { tasks = new HashMap<Integer, Task>(); queued = new LinkedList<Task>(); next_id = 1; } void addTask(Task task) { addTask(task, false); } /** * Add a task to manage. * @param task */ void addTask (Task task, boolean isPriority) { int id = next_id++; task.setTaskID(id); if (task.isQueued()) { synchronized (queued) { if(isPriority) queued.addFirst(task); else queued.addLast(task); } } else { synchronized (tasks) { tasks.put(id, task); } } } /** * Remove all finished tasks. * @param dh_table Needed to ask permission to start a task */ void removeFinishedTasks (DHTBase dh_table) { synchronized (tasks) { List<Integer> rm = new ArrayList<Integer>(tasks.size()); for (Task task : tasks.values()) { if (task.isFinished()) { rm.add(task.getTaskID()); } } for (Integer i : rm) { tasks.remove(i); } synchronized (queued) { while (dh_table.canStartTask() && queued.size() > 0) { Task t = queued.removeFirst(); //Out(SYS_DHT|LOG_NOTICE) << "DHT: starting queued task" << endl; t.start(); tasks.put(t.getTaskID(), t); } } } } /// Get the number of running tasks int getNumTasks () { return tasks.size(); } /// Get the number of queued tasks int getNumQueuedTasks () { return queued.size(); } public Task[] getActiveTasks () { synchronized (tasks) { return tasks.values().toArray(new Task[tasks.size()]); } } public Task[] getQueuedTasks () { synchronized (queued) { return queued.toArray(new Task[queued.size()]); } } }