I2CP: Use EnumSets for state checking

This commit is contained in:
zzz
2019-06-17 15:46:28 +00:00
parent a8f2745169
commit 6d8431a77e

View File

@ -21,10 +21,12 @@ import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -166,6 +168,18 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2
CLOSED CLOSED
} }
private static final Set<State> STATES_CLOSED =
EnumSet.of(State.INIT, State.CLOSED);
private static final Set<State> STATES_OPENING =
EnumSet.of(State.INIT, State.OPENING);
private static final Set<State> STATES_CLOSED_OR_OPENING =
EnumSet.of(State.INIT, State.CLOSED, State.OPENING);
private static final Set<State> STATES_CLOSED_OR_CLOSING =
EnumSet.of(State.INIT, State.CLOSED, State.CLOSING);
protected State _state = State.INIT; protected State _state = State.INIT;
protected final Object _stateLock = new Object(); protected final Object _stateLock = new Object();
@ -850,7 +864,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2
synchronized(_stateLock) { synchronized(_stateLock) {
if (_state == State.GOTDATE) if (_state == State.GOTDATE)
break; break;
if (_state != State.OPENING && _state != State.INIT) if (!STATES_OPENING.contains(_state))
throw new IOException("Socket closed, state=" + _state); throw new IOException("Socket closed, state=" + _state);
// InterruptedException caught by caller // InterruptedException caught by caller
_stateLock.wait(1000); _stateLock.wait(1000);
@ -1165,7 +1179,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2
*/ */
public boolean isClosed() { public boolean isClosed() {
synchronized (_stateLock) { synchronized (_stateLock) {
return _state == State.CLOSED || _state == State.INIT; return STATES_CLOSED.contains(_state);
} }
} }
@ -1281,7 +1295,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2
*/ */
public void destroySession(boolean sendDisconnect) { public void destroySession(boolean sendDisconnect) {
synchronized(_stateLock) { synchronized(_stateLock) {
if (_state == State.CLOSING || _state == State.CLOSED || _state == State.INIT) if (STATES_CLOSED_OR_CLOSING.contains(_state))
return; return;
changeState(State.CLOSING); changeState(State.CLOSING);
} }
@ -1378,7 +1392,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2
protected void disconnect() { protected void disconnect() {
State oldState; State oldState;
synchronized(_stateLock) { synchronized(_stateLock) {
if (_state == State.CLOSING || _state == State.CLOSED || _state == State.INIT) if (STATES_CLOSED_OR_CLOSING.contains(_state))
return; return;
oldState = _state; oldState = _state;
changeState(State.CLOSING); changeState(State.CLOSING);
@ -1606,9 +1620,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2
} }
synchronized (_stateLock) { synchronized (_stateLock) {
// not before GOTDATE // not before GOTDATE
if (_state == State.CLOSED || if (STATES_CLOSED_OR_OPENING.contains(_state)) {
_state == State.INIT ||
_state == State.OPENING) {
if (_log.shouldLog(Log.INFO)) if (_log.shouldLog(Log.INFO))
_log.info("Session closed, cannot lookup " + h); _log.info("Session closed, cannot lookup " + h);
return null; return null;
@ -1750,9 +1762,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2
public int[] bandwidthLimits() throws I2PSessionException { public int[] bandwidthLimits() throws I2PSessionException {
synchronized (_stateLock) { synchronized (_stateLock) {
// not before GOTDATE // not before GOTDATE
if (_state == State.CLOSED || if (STATES_CLOSED_OR_OPENING.contains(_state)) {
_state == State.INIT ||
_state == State.OPENING) {
if (_log.shouldLog(Log.INFO)) if (_log.shouldLog(Log.INFO))
_log.info("Session closed, cannot get bw limits"); _log.info("Session closed, cannot get bw limits");
return null; return null;