From: jprocter Date: Thu, 27 Oct 2011 11:20:12 +0000 (+0100) Subject: (JAL-961) methods for checking calculation status X-Git-Tag: Jalview_2_9~566^2~8 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=61df2ddd377ad0171a6d203fb9db2e1fa8ba5be6;p=jalview.git (JAL-961) methods for checking calculation status --- diff --git a/src/jalview/api/AlignCalcManagerI.java b/src/jalview/api/AlignCalcManagerI.java index 2c406a2..e310696 100644 --- a/src/jalview/api/AlignCalcManagerI.java +++ b/src/jalview/api/AlignCalcManagerI.java @@ -21,7 +21,7 @@ public interface AlignCalcManagerI * tell manager that worker is now processing data * @param worker */ - void notifyWorking(AlignCalcWorkerI worker); + boolean notifyWorking(AlignCalcWorkerI worker); /** @@ -42,4 +42,17 @@ public interface AlignCalcManagerI */ void startWorker(AlignCalcWorkerI worker); + /** + * + * @param worker + * @return + */ + boolean isWorking(AlignCalcWorkerI worker); + + /** + * if any worker thread is operational, return true! + * @return + */ + boolean isWorking(); + } diff --git a/src/jalview/workers/AlignCalcManager.java b/src/jalview/workers/AlignCalcManager.java index 473e31b..ef627fa 100644 --- a/src/jalview/workers/AlignCalcManager.java +++ b/src/jalview/workers/AlignCalcManager.java @@ -10,49 +10,68 @@ import jalview.api.AlignCalcWorkerI; public class AlignCalcManager implements AlignCalcManagerI { - private List blackList=new ArrayList(); + private List blackList = new ArrayList(); + /** * global record of calculations in progress */ - private static Hashtable inProgress=new Hashtable(); + private static Hashtable inProgress = new Hashtable(); + /** * record of calculations pending or in progress in the current context */ - private Map> updating=new Hashtable>(); - + private Map> updating = new Hashtable>(); + @Override public void notifyStart(AlignCalcWorkerI worker) { List upd = updating.get(worker.getClass()); - if (upd==null) + if (upd == null) { - updating.put(worker.getClass(), upd=new ArrayList()); + updating.put(worker.getClass(), + upd = new ArrayList()); } - upd.add(worker); + // upd.add(worker); } @Override - public boolean alreadyDoing(AlignCalcWorkerI worker) + public synchronized boolean alreadyDoing(AlignCalcWorkerI worker) { return inProgress.containsKey(worker.getClass()); } @Override - public void notifyWorking(AlignCalcWorkerI worker) + public synchronized boolean notifyWorking(AlignCalcWorkerI worker) { - // TODO: decide if we should throw exceptions here if multiple workers start to work - if (inProgress.get(worker.getClass())!=null) + // synchronized (inProgress) { - System.err.println("Warning: Multiple workers are running of type "+worker.getClass()); + // TODO: decide if we should throw exceptions here if multiple workers + // start to work + if (inProgress.get(worker.getClass()) != null) + { + if (false) + { + System.err + .println("Warning: Multiple workers are running of type " + + worker.getClass()); + } + return false; + } + inProgress.put(worker.getClass(), worker); } - inProgress.put(worker.getClass(), worker); - + return true; } @Override - public void workerComplete(AlignCalcWorkerI worker) + public synchronized void workerComplete(AlignCalcWorkerI worker) { - inProgress.remove(worker); + inProgress.remove(worker.getClass()); + List upd = updating.get(worker.getClass()); + if (upd != null) + { + upd.remove(worker); + } + } @Override @@ -60,6 +79,7 @@ public class AlignCalcManager implements AlignCalcManagerI { blackList.add(worker.getClass()); } + public boolean isBlackListed(Class workerType) { return blackList.contains(workerType); @@ -70,4 +90,17 @@ public class AlignCalcManager implements AlignCalcManagerI { new Thread(worker).start(); } + + @Override + public synchronized boolean isWorking(AlignCalcWorkerI worker) + { +// System.err.println("isWorking : worker "+(worker!=null ? worker.getClass():"null")+ " "+hashCode()); + return worker!=null && inProgress.get(worker.getClass()) == worker; + } + @Override + public boolean isWorking() + { +// System.err.println("isWorking "+hashCode()); + return inProgress.size()>0; + } }