From f3a047ff44ceaeffe5cace07f3fee1d0a65d0697 Mon Sep 17 00:00:00 2001 From: angryziber Date: Wed, 9 Apr 2008 22:52:44 +0000 Subject: [PATCH] slightly better synchronization in the state machine git-svn-id: https://ipscan.svn.sourceforge.net/svnroot/ipscan/trunk@386 375186e5-ef17-0410-b0b6-91563547dcda --- TODO | 1 + .../azib/ipscan/core/state/StateMachine.java | 29 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/TODO b/TODO index fb88122f..93b4fbc2 100644 --- a/TODO +++ b/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 diff --git a/src/net/azib/ipscan/core/state/StateMachine.java b/src/net/azib/ipscan/core/state/StateMachine.java index 0e083d3f..293a5a67 100644 --- a/src/net/azib/ipscan/core/state/StateMachine.java +++ b/src/net/azib/ipscan/core/state/StateMachine.java @@ -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 transitionListeners = Collections.synchronizedList(new ArrayList()); + private ReentrantReadWriteLock listenersLock = new ReentrantReadWriteLock(); + private List transitionListeners = new ArrayList(); /** * @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(); + } } /**