diff options
Diffstat (limited to 'jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java')
-rw-r--r-- | jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java | 350 |
1 files changed, 8 insertions, 342 deletions
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java index 93ce53f03c..abaf1df7d2 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java @@ -42,7 +42,6 @@ public abstract class AbstractConnection implements Connection private static final Logger LOG = Log.getLogger(AbstractConnection.class); private final List<Listener> listeners = new CopyOnWriteArrayList<>(); - private final AtomicReference<State> _state = new AtomicReference<>(IDLE); private final long _created=System.currentTimeMillis(); private final EndPoint _endPoint; private final Executor _executor; @@ -58,7 +57,6 @@ public abstract class AbstractConnection implements Connection _executor = executor; _readCallback = new ReadCallback(); _dispatchIO = dispatchIO; - _state.set(IDLE); } @Override @@ -125,30 +123,7 @@ public abstract class AbstractConnection implements Connection { if (LOG.isDebugEnabled()) LOG.debug("fillInterested {}",this); - - while(true) - { - State state=_state.get(); - if (next(state,state.fillInterested())) - break; - } - } - - public void fillInterested(Callback callback) - { - if (LOG.isDebugEnabled()) - LOG.debug("fillInterested {}",this); - - while(true) - { - State state=_state.get(); - // TODO yuck - if (state instanceof FillingInterestedCallback && ((FillingInterestedCallback)state)._callback==callback) - break; - State next=new FillingInterestedCallback(callback,state); - if (next(state,next)) - break; - } + getEndPoint().fillInterested(_readCallback); } /** @@ -175,12 +150,12 @@ public abstract class AbstractConnection implements Connection if (_endPoint.isOutputShutdown()) _endPoint.close(); else + { _endPoint.shutdownOutput(); + fillInterested(); + } } - } - - if (_endPoint.isOpen()) - fillInterested(); + } } /** @@ -257,330 +232,21 @@ public abstract class AbstractConnection implements Connection @Override public String toString() { - return String.format("%s@%x{%s}", getClass().getSimpleName(), hashCode(), _state.get()); - } - - public boolean next(State state, State next) - { - if (next==null) - return true; - if(_state.compareAndSet(state,next)) - { - if (LOG.isDebugEnabled()) - LOG.debug("{}-->{} {}",state,next,this); - if (next!=state) - next.onEnter(AbstractConnection.this); - return true; - } - return false; - } - - private static final class IdleState extends State - { - private IdleState() - { - super("IDLE"); - } - - @Override - State fillInterested() - { - return FILL_INTERESTED; - } - } - - - private static final class FillInterestedState extends State - { - private FillInterestedState() - { - super("FILL_INTERESTED"); - } - - @Override - public void onEnter(AbstractConnection connection) - { - connection.getEndPoint().fillInterested(connection._readCallback); - } - - @Override - State fillInterested() - { - return this; - } - - @Override - public State onFillable() - { - return FILLING; - } - - @Override - State onFailed() - { - return IDLE; - } - } - - - private static final class RefillingState extends State - { - private RefillingState() - { - super("REFILLING"); - } - - @Override - State fillInterested() - { - return FILLING_FILL_INTERESTED; - } - - @Override - public State onFilled() - { - return IDLE; - } - } - - - private static final class FillingFillInterestedState extends State - { - private FillingFillInterestedState(String name) - { - super(name); - } - - @Override - State fillInterested() - { - return this; - } - - State onFilled() - { - return FILL_INTERESTED; - } - } - - - private static final class FillingState extends State - { - private FillingState() - { - super("FILLING"); - } - - @Override - public void onEnter(AbstractConnection connection) - { - if (connection.isDispatchIO()) - connection.getExecutor().execute(connection._runOnFillable); - else - connection._runOnFillable.run(); - } - - @Override - State fillInterested() - { - return FILLING_FILL_INTERESTED; - } - - @Override - public State onFilled() - { - return IDLE; - } - } - - - public static class State - { - private final String _name; - State(String name) - { - _name=name; - } - - @Override - public String toString() - { - return _name; - } - - void onEnter(AbstractConnection connection) - { - } - - State fillInterested() - { - throw new IllegalStateException(this.toString()); - } - - State onFillable() - { - throw new IllegalStateException(this.toString()); - } - - State onFilled() - { - throw new IllegalStateException(this.toString()); - } - - State onFailed() - { - throw new IllegalStateException(this.toString()); - } + return String.format("%s@%x", getClass().getSimpleName(), hashCode()); } - - public static final State IDLE=new IdleState(); - - public static final State FILL_INTERESTED=new FillInterestedState(); - - public static final State FILLING=new FillingState(); - - public static final State REFILLING=new RefillingState(); - - public static final State FILLING_FILL_INTERESTED=new FillingFillInterestedState("FILLING_FILL_INTERESTED"); - - public class NestedState extends State - { - private final State _nested; - - NestedState(State nested) - { - super("NESTED("+nested+")"); - _nested=nested; - } - NestedState(String name,State nested) - { - super(name+"("+nested+")"); - _nested=nested; - } - - @Override - State fillInterested() - { - return new NestedState(_nested.fillInterested()); - } - - @Override - State onFillable() - { - return new NestedState(_nested.onFillable()); - } - - @Override - State onFilled() - { - return new NestedState(_nested.onFilled()); - } - } - - - public class FillingInterestedCallback extends NestedState - { - private final Callback _callback; - - FillingInterestedCallback(Callback callback,State nested) - { - super("FILLING_INTERESTED_CALLBACK",nested==FILLING?REFILLING:nested); - _callback=callback; - } - - @Override - void onEnter(final AbstractConnection connection) - { - Callback callback=new Callback() - { - @Override - public void succeeded() - { - while(true) - { - State state = connection._state.get(); - if (!(state instanceof NestedState)) - break; - State nested=((NestedState)state)._nested; - if (connection.next(state,nested)) - break; - } - _callback.succeeded(); - } - - @Override - public void failed(Throwable x) - { - while(true) - { - State state = connection._state.get(); - if (!(state instanceof NestedState)) - break; - State nested=((NestedState)state)._nested; - if (connection.next(state,nested)) - break; - } - _callback.failed(x); - } - }; - - connection.getEndPoint().fillInterested(callback); - } - } - - private final Runnable _runOnFillable = new Runnable() - { - @Override - public void run() - { - try - { - onFillable(); - } - finally - { - while(true) - { - State state=_state.get(); - if (next(state,state.onFilled())) - break; - } - } - } - }; - - private class ReadCallback implements Callback { @Override public void succeeded() { - while(true) - { - State state=_state.get(); - if (next(state,state.onFillable())) - break; - } + onFillable(); } @Override public void failed(final Throwable x) { - _executor.execute(new Runnable() - { - @Override - public void run() - { - while(true) - { - State state=_state.get(); - if (next(state,state.onFailed())) - break; - } - onFillInterestedFailed(x); - } - }); + onFillInterestedFailed(x); } @Override |