slightly better synchronization in the state machine

git-svn-id: https://ipscan.svn.sourceforge.net/svnroot/ipscan/trunk@386 375186e5-ef17-0410-b0b6-91563547dcda
This commit is contained in:
angryziber 2008-04-09 22:52:44 +00:00
parent 63bbcd12c0
commit f3a047ff44
2 changed files with 24 additions and 6 deletions

1
TODO
View File

@ -1,5 +1,6 @@
Before 3.0:
* windows 48 icon for Vista
* command-line scanning start
* fetcher-specific options
* multiple port support web-detect

View File

@ -6,8 +6,8 @@
package net.azib.ipscan.core.state;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* StateMachine implementation.
@ -17,9 +17,10 @@ import java.util.List;
*/
public class StateMachine {
private ScanningState state = ScanningState.IDLE;
private volatile ScanningState state = ScanningState.IDLE;
private List<StateTransitionListener> transitionListeners = Collections.synchronizedList(new ArrayList<StateTransitionListener>());
private ReentrantReadWriteLock listenersLock = new ReentrantReadWriteLock();
private List<StateTransitionListener> transitionListeners = new ArrayList<StateTransitionListener>();
/**
* @param state
@ -41,7 +42,13 @@ public class StateMachine {
* @param listener instance
*/
public void addTransitionListener(StateTransitionListener listener) {
transitionListeners.add(listener);
try {
listenersLock.writeLock().lock();
transitionListeners.add(listener);
}
finally {
listenersLock.writeLock().unlock();
}
}
/**
@ -49,7 +56,13 @@ public class StateMachine {
* @param killHandler
*/
public void removeTransitionListener(StateTransitionListener listener) {
transitionListeners.remove(listener);
try {
listenersLock.writeLock().lock();
transitionListeners.remove(listener);
}
finally {
listenersLock.writeLock().unlock();
}
}
/**
@ -65,11 +78,15 @@ public class StateMachine {
}
private void notifyAboutTransition() {
synchronized (transitionListeners) {
try {
listenersLock.readLock().lock();
for (StateTransitionListener listener : transitionListeners) {
listener.transitionTo(state);
}
}
finally {
listenersLock.readLock().unlock();
}
}
/**