From: <bea...@us...> - 2006-11-21 22:06:08
|
Revision: 337 http://svn.sourceforge.net/cishell/?rev=337&view=rev Author: bearsfan Date: 2006-11-21 14:06:07 -0800 (Tue, 21 Nov 2006) Log Message: ----------- Fixed a race condition for scheduling an algorithm Modified Paths: -------------- trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java Modified: trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java =================================================================== --- trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java 2006-11-21 22:05:30 UTC (rev 336) +++ trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java 2006-11-21 22:06:07 UTC (rev 337) @@ -411,12 +411,17 @@ "State was not one of allowable states: " + state); } } - this._algMap.put(alg, new AlgorithmTask(alg, ref, time, this)); + //this._algMap.put(alg, new AlgorithmTask(alg, ref, time, this)); + new AlgorithmTask(alg, ref, time, this); } public synchronized final int getMaxSimultaneousAlgs() { return this._maxSimultaneousAlgs; } + + public synchronized final void registerAlgorithmTask(Algorithm algorithm, AlgorithmTask algorithmTask) { + this._algMap.put(algorithm, algorithmTask); + } /** * @param alg @@ -483,7 +488,7 @@ private volatile int _numRunning = 0; - public void algorithmScheduled(Algorithm algorithm, Calendar time) { + public synchronized void algorithmScheduled(Algorithm algorithm, Calendar time) { _schedulerListener.algorithmScheduled(algorithm, time); } @@ -492,32 +497,32 @@ _schedulerListener.algorithmStarted(algorithm); } - public void algorithmError(Algorithm algorithm, Throwable error) { - purgeFinished(); + public synchronized void algorithmError(Algorithm algorithm, Throwable error) { _numRunning--; _schedulerListener.algorithmError(algorithm, error); + purgeFinished(); } - public void algorithmFinished(Algorithm algorithm, Data[] createdDM) { - purgeFinished(); + public synchronized void algorithmFinished(Algorithm algorithm, Data[] createdDM) { _numRunning--; _schedulerListener.algorithmFinished(algorithm, createdDM); + purgeFinished(); } - public void algorithmRescheduled(Algorithm algorithm, Calendar time) { + public synchronized void algorithmRescheduled(Algorithm algorithm, Calendar time) { _schedulerListener.algorithmRescheduled(algorithm, time); } - public void algorithmUnscheduled(Algorithm algorithm) { + public synchronized void algorithmUnscheduled(Algorithm algorithm) { _schedulerListener.algorithmUnscheduled(algorithm); } - public void schedulerCleared() { + public synchronized void schedulerCleared() { _schedulerListener.schedulerCleared(); } - public void schedulerRunStateChanged(boolean isRunning) { + public synchronized void schedulerRunStateChanged(boolean isRunning) { _schedulerListener.schedulerRunStateChanged(isRunning); } } @@ -609,11 +614,13 @@ private SchedulerListener _schedulerListener; public AlgorithmTask(Algorithm alg, ServiceReference ref, Calendar scheduledTime, - SchedulerListener listener) { + //SchedulerListener listener) { + AlgSchedulerTask algSchedulerTask) { _alg = alg; _ref = ref; _scheduledTime = scheduledTime; - _schedulerListener = listener; + _schedulerListener = algSchedulerTask; + algSchedulerTask.registerAlgorithmTask(alg, this); _init(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bea...@us...> - 2006-12-21 18:17:32
|
Revision: 361 http://svn.sourceforge.net/cishell/?rev=361&view=rev Author: bearsfan Date: 2006-12-21 10:17:26 -0800 (Thu, 21 Dec 2006) Log Message: ----------- Added an unsynchronized map for retrieving a ServiceReference Modified Paths: -------------- trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java Modified: trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java =================================================================== --- trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java 2006-12-21 02:55:51 UTC (rev 360) +++ trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/scheduler/SchedulerServiceImpl.java 2006-12-21 18:17:26 UTC (rev 361) @@ -223,6 +223,7 @@ public void setRunning(boolean isRunning) { _algSchedulerTask.setRunning(isRunning); + _schedulerListenerInformer.schedulerRunStateChanged(isRunning); } } @@ -312,6 +313,7 @@ class AlgSchedulerTask extends TimerTask implements SchedulerListener { private Map _algMap; + private Map _algServiceMap; private volatile boolean _running = true; // Default allow as many as needed @@ -349,6 +351,7 @@ public AlgSchedulerTask(SchedulerListener listener) { _algMap = Collections.synchronizedMap(new HashMap()); + _algServiceMap = new HashMap(); setSchedulerListener(listener); } @@ -356,13 +359,8 @@ _schedulerListener = listener; } - public synchronized final ServiceReference getServiceReference(Algorithm algorithm) { - AlgorithmTask task = (AlgorithmTask)_algMap.get(algorithm); - if (task != null) { - return task.getServiceReference(); - } else { - return null; - } + public final ServiceReference getServiceReference(Algorithm algorithm) { + return (ServiceReference) _algServiceMap.get(algorithm); } public synchronized final Calendar getScheduledTime(Algorithm algorithm) { @@ -420,6 +418,7 @@ } public synchronized final void registerAlgorithmTask(Algorithm algorithm, AlgorithmTask algorithmTask) { + this._algServiceMap.put(algorithm, algorithmTask.getServiceReference()); this._algMap.put(algorithm, algorithmTask); } @@ -445,8 +444,10 @@ while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); AlgorithmTask task = (AlgorithmTask) entry.getValue(); - if (task.getState() == STATE.STOPPED) + if (task.getState() == STATE.STOPPED) { iter.remove(); + _algServiceMap.remove(entry.getKey()); + } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |