mirror of
https://github.com/angryip/ipscan.git
synced 2025-10-26 11:18:17 +00:00
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:
parent
63bbcd12c0
commit
f3a047ff44
1
TODO
1
TODO
@ -1,5 +1,6 @@
|
||||
Before 3.0:
|
||||
|
||||
* windows 48 icon for Vista
|
||||
* command-line scanning start
|
||||
* fetcher-specific options
|
||||
* multiple port support web-detect
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user