Mercurial Hosting > luan
changeset 978:bdb6eb0fbf93
simplify ChannelEndPoint
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 16 Oct 2016 14:53:43 -0600 |
parents | d35b0a3a7a4a |
children | c8cd3e96db5f |
files | src/org/eclipse/jetty/io/EndPoint.java src/org/eclipse/jetty/io/nio/ChannelEndPoint.java src/org/eclipse/jetty/io/nio/SslConnection.java src/org/eclipse/jetty/server/AsyncHttpConnection.java src/org/eclipse/jetty/server/nio/BlockingChannelConnector.java |
diffstat | 5 files changed, 186 insertions(+), 255 deletions(-) [+] |
line wrap: on
line diff
--- a/src/org/eclipse/jetty/io/EndPoint.java Sun Oct 16 01:31:05 2016 -0600 +++ b/src/org/eclipse/jetty/io/EndPoint.java Sun Oct 16 14:53:43 2016 -0600 @@ -19,6 +19,7 @@ package org.eclipse.jetty.io; import java.io.IOException; +import java.nio.channels.SocketChannel; /** @@ -27,148 +28,140 @@ */ public interface EndPoint { - /** - * Shutdown any backing output stream associated with the endpoint - */ - void shutdownOutput() throws IOException; + /** + * Shutdown any backing output stream associated with the endpoint + */ + void shutdownOutput() throws IOException; - boolean isOutputShutdown(); + boolean isOutputShutdown(); - /** - * Shutdown any backing input stream associated with the endpoint - */ - void shutdownInput() throws IOException; + /** + * Shutdown any backing input stream associated with the endpoint + */ + void shutdownInput() throws IOException; - boolean isInputShutdown(); + boolean isInputShutdown(); - /** - * Close any backing stream associated with the endpoint - */ - void close() throws IOException; + /** + * Close any backing stream associated with the endpoint + */ + void close() throws IOException; - /** - * Fill the buffer from the current putIndex to it's capacity from whatever - * byte source is backing the buffer. The putIndex is increased if bytes filled. - * The buffer may chose to do a compact before filling. - * @return an <code>int</code> value indicating the number of bytes - * filled or -1 if EOF is reached. - * @throws EofException If input is shutdown or the endpoint is closed. - */ - int fill(Buffer buffer) throws IOException; + /** + * Fill the buffer from the current putIndex to it's capacity from whatever + * byte source is backing the buffer. The putIndex is increased if bytes filled. + * The buffer may chose to do a compact before filling. + * @return an <code>int</code> value indicating the number of bytes + * filled or -1 if EOF is reached. + * @throws EofException If input is shutdown or the endpoint is closed. + */ + int fill(Buffer buffer) throws IOException; - /** - * Flush the buffer from the current getIndex to it's putIndex using whatever byte - * sink is backing the buffer. The getIndex is updated with the number of bytes flushed. - * Any mark set is cleared. - * If the entire contents of the buffer are flushed, then an implicit empty() is done. - * - * @param buffer The buffer to flush. This buffers getIndex is updated. - * @return the number of bytes written - * @throws EofException If the endpoint is closed or output is shutdown. - */ - int flush(Buffer buffer) throws IOException; + /** + * Flush the buffer from the current getIndex to it's putIndex using whatever byte + * sink is backing the buffer. The getIndex is updated with the number of bytes flushed. + * Any mark set is cleared. + * If the entire contents of the buffer are flushed, then an implicit empty() is done. + * + * @param buffer The buffer to flush. This buffers getIndex is updated. + * @return the number of bytes written + * @throws EofException If the endpoint is closed or output is shutdown. + */ + int flush(Buffer buffer) throws IOException; - /** - * Flush the buffer from the current getIndex to it's putIndex using whatever byte - * sink is backing the buffer. The getIndex is updated with the number of bytes flushed. - * Any mark set is cleared. - * If the entire contents of the buffer are flushed, then an implicit empty() is done. - * The passed header/trailer buffers are written before/after the contents of this buffer. This may be done - * either as gather writes, as a poke into this buffer or as several writes. The implementation is free to - * select the optimal mechanism. - * @param header A buffer to write before flushing this buffer. This buffers getIndex is updated. - * @param buffer The buffer to flush. This buffers getIndex is updated. - * @param trailer A buffer to write after flushing this buffer. This buffers getIndex is updated. - * @return the total number of bytes written. - */ - int flush(Buffer header, Buffer buffer, Buffer trailer) throws IOException; + /** + * Flush the buffer from the current getIndex to it's putIndex using whatever byte + * sink is backing the buffer. The getIndex is updated with the number of bytes flushed. + * Any mark set is cleared. + * If the entire contents of the buffer are flushed, then an implicit empty() is done. + * The passed header/trailer buffers are written before/after the contents of this buffer. This may be done + * either as gather writes, as a poke into this buffer or as several writes. The implementation is free to + * select the optimal mechanism. + * @param header A buffer to write before flushing this buffer. This buffers getIndex is updated. + * @param buffer The buffer to flush. This buffers getIndex is updated. + * @param trailer A buffer to write after flushing this buffer. This buffers getIndex is updated. + * @return the total number of bytes written. + */ + int flush(Buffer header, Buffer buffer, Buffer trailer) throws IOException; - /* ------------------------------------------------------------ */ - /** - * @return The local IP address to which this <code>EndPoint</code> is bound, or <code>null</code> - * if this <code>EndPoint</code> does not represent a network connection. - */ - public String getLocalAddr(); + /* ------------------------------------------------------------ */ + /** + * @return The local IP address to which this <code>EndPoint</code> is bound, or <code>null</code> + * if this <code>EndPoint</code> does not represent a network connection. + */ + public String getLocalAddr(); - /* ------------------------------------------------------------ */ - /** - * @return The local host name to which this <code>EndPoint</code> is bound, or <code>null</code> - * if this <code>EndPoint</code> does not represent a network connection. - */ - public String getLocalHost(); - - /* ------------------------------------------------------------ */ - /** - * @return The local port number on which this <code>EndPoint</code> is listening, or <code>0</code> - * if this <code>EndPoint</code> does not represent a network connection. - */ - public int getLocalPort(); + /* ------------------------------------------------------------ */ + /** + * @return The local host name to which this <code>EndPoint</code> is bound, or <code>null</code> + * if this <code>EndPoint</code> does not represent a network connection. + */ + public String getLocalHost(); - /* ------------------------------------------------------------ */ - /** - * @return The remote IP address to which this <code>EndPoint</code> is connected, or <code>null</code> - * if this <code>EndPoint</code> does not represent a network connection. - */ - public String getRemoteAddr(); + /* ------------------------------------------------------------ */ + /** + * @return The local port number on which this <code>EndPoint</code> is listening, or <code>0</code> + * if this <code>EndPoint</code> does not represent a network connection. + */ + public int getLocalPort(); - /* ------------------------------------------------------------ */ - /** - * @return The host name of the remote machine to which this <code>EndPoint</code> is connected, or <code>null</code> - * if this <code>EndPoint</code> does not represent a network connection. - */ - public String getRemoteHost(); + /* ------------------------------------------------------------ */ + /** + * @return The remote IP address to which this <code>EndPoint</code> is connected, or <code>null</code> + * if this <code>EndPoint</code> does not represent a network connection. + */ + public String getRemoteAddr(); - /* ------------------------------------------------------------ */ - /** - * @return The remote port number to which this <code>EndPoint</code> is connected, or <code>0</code> - * if this <code>EndPoint</code> does not represent a network connection. - */ - public int getRemotePort(); + /* ------------------------------------------------------------ */ + /** + * @return The host name of the remote machine to which this <code>EndPoint</code> is connected, or <code>null</code> + * if this <code>EndPoint</code> does not represent a network connection. + */ + public String getRemoteHost(); - /* ------------------------------------------------------------ */ - public boolean isBlocking(); - - /* ------------------------------------------------------------ */ - public boolean blockReadable(long millisecs) throws IOException; - - /* ------------------------------------------------------------ */ - public boolean blockWritable(long millisecs) throws IOException; + /* ------------------------------------------------------------ */ + /** + * @return The remote port number to which this <code>EndPoint</code> is connected, or <code>0</code> + * if this <code>EndPoint</code> does not represent a network connection. + */ + public int getRemotePort(); - /* ------------------------------------------------------------ */ - public boolean isOpen(); + public boolean isBlocking(); + + public boolean blockReadable(long millisecs) throws IOException; - /* ------------------------------------------------------------ */ - /** - * @return The underlying transport object (socket, channel, etc.) - */ - public Object getTransport(); + public boolean blockWritable(long millisecs) throws IOException; + + public boolean isOpen(); + + public SocketChannel getChannel(); - /* ------------------------------------------------------------ */ - /** Flush any buffered output. - * May fail to write all data if endpoint is non-blocking - * @throws EofException If the endpoint is closed or output is shutdown. - */ - public void flush() throws IOException; + /* ------------------------------------------------------------ */ + /** Flush any buffered output. + * May fail to write all data if endpoint is non-blocking + * @throws EofException If the endpoint is closed or output is shutdown. + */ + public void flush() throws IOException; - /* ------------------------------------------------------------ */ - /** Get the max idle time in ms. - * <p>The max idle time is the time the endpoint can be idle before - * extraordinary handling takes place. This loosely corresponds to - * the {@link java.net.Socket#getSoTimeout()} for blocking connections, - * but {@link AsyncEndPoint} implementations must use other mechanisms - * to implement the max idle time. - * @return the max idle time in ms or if ms <= 0 implies an infinite timeout - */ - public int getMaxIdleTime(); + /* ------------------------------------------------------------ */ + /** Get the max idle time in ms. + * <p>The max idle time is the time the endpoint can be idle before + * extraordinary handling takes place. This loosely corresponds to + * the {@link java.net.Socket#getSoTimeout()} for blocking connections, + * but {@link AsyncEndPoint} implementations must use other mechanisms + * to implement the max idle time. + * @return the max idle time in ms or if ms <= 0 implies an infinite timeout + */ + public int getMaxIdleTime(); - /* ------------------------------------------------------------ */ - /** Set the max idle time. - * @param timeMs the max idle time in MS. Timeout <= 0 implies an infinite timeout - * @throws IOException if the timeout cannot be set. - */ - public void setMaxIdleTime(int timeMs) throws IOException; + /* ------------------------------------------------------------ */ + /** Set the max idle time. + * @param timeMs the max idle time in MS. Timeout <= 0 implies an infinite timeout + * @throws IOException if the timeout cannot be set. + */ + public void setMaxIdleTime(int timeMs) throws IOException;
--- a/src/org/eclipse/jetty/io/nio/ChannelEndPoint.java Sun Oct 16 01:31:05 2016 -0600 +++ b/src/org/eclipse/jetty/io/nio/ChannelEndPoint.java Sun Oct 16 14:53:43 2016 -0600 @@ -25,7 +25,6 @@ import java.nio.ByteBuffer; import java.nio.channels.ByteChannel; import java.nio.channels.GatheringByteChannel; -import java.nio.channels.SelectableChannel; import java.nio.channels.SocketChannel; import org.eclipse.jetty.io.Buffer; @@ -43,36 +42,29 @@ { private static final Logger LOG = LoggerFactory.getLogger(ChannelEndPoint.class); - protected final ByteChannel _channel; - protected final ByteBuffer[] _gather2=new ByteBuffer[2]; + private final SocketChannel _channel; + private final ByteBuffer[] _gather2 = new ByteBuffer[2]; protected final Socket _socket; - protected final InetSocketAddress _local; - protected final InetSocketAddress _remote; + private final InetSocketAddress _local; + private final InetSocketAddress _remote; protected volatile int _maxIdleTime; - private volatile boolean _ishut; - private volatile boolean _oshut; + private volatile boolean _ishut = false; + private volatile boolean _oshut = false; - protected ChannelEndPoint(ByteChannel channel, int maxIdleTime) throws IOException + protected ChannelEndPoint(SocketChannel channel, int maxIdleTime) throws IOException { this._channel = channel; _maxIdleTime = maxIdleTime; - _socket = (channel instanceof SocketChannel)?((SocketChannel)channel).socket():null; - if (_socket!=null) - { - _local = (InetSocketAddress)_socket.getLocalSocketAddress(); - _remote = (InetSocketAddress)_socket.getRemoteSocketAddress(); - _socket.setSoTimeout(_maxIdleTime); - } - else - { - _local = _remote = null; - } + _socket = channel.socket(); + _local = (InetSocketAddress)_socket.getLocalSocketAddress(); + _remote = (InetSocketAddress)_socket.getRemoteSocketAddress(); + _socket.setSoTimeout(_maxIdleTime); } @Override public final boolean isBlocking() { - return !(_channel instanceof SelectableChannel) || ((SelectableChannel)_channel).isBlocking(); + return _channel.isBlocking(); } @Override @@ -100,26 +92,23 @@ _ishut = true; if (_channel.isOpen()) { - if (_socket != null) + try { - try + if (!_socket.isInputShutdown()) { - if (!_socket.isInputShutdown()) - { - _socket.shutdownInput(); - } + _socket.shutdownInput(); } - catch (SocketException e) + } + catch (SocketException e) + { + LOG.debug(e.toString()); + LOG.trace("",e); + } + finally + { + if (_oshut) { - LOG.debug(e.toString()); - LOG.trace("",e); - } - finally - { - if (_oshut) - { - close(); - } + close(); } } } @@ -132,26 +121,23 @@ _oshut = true; if (_channel.isOpen()) { - if (_socket != null) + try { - try + if (!_socket.isOutputShutdown()) { - if (!_socket.isOutputShutdown()) - { - _socket.shutdownOutput(); - } + _socket.shutdownOutput(); } - catch (SocketException e) + } + catch (SocketException e) + { + LOG.debug(e.toString()); + LOG.trace("",e); + } + finally + { + if (_ishut) { - LOG.debug(e.toString()); - LOG.trace("",e); - } - finally - { - if (_ishut) - { - close(); - } + close(); } } } @@ -160,13 +146,13 @@ @Override public final boolean isOutputShutdown() { - return _oshut || !_channel.isOpen() || _socket != null && _socket.isOutputShutdown(); + return _oshut || !_channel.isOpen() || _socket.isOutputShutdown(); } @Override public final boolean isInputShutdown() { - return _ishut || !_channel.isOpen() || _socket != null && _socket.isInputShutdown(); + return _ishut || !_channel.isOpen() || _socket.isInputShutdown(); } @Override @@ -176,9 +162,7 @@ _channel.close(); } - /* (non-Javadoc) - * @see org.eclipse.io.EndPoint#fill(org.eclipse.io.Buffer) - */ + @Override public int fill(Buffer buffer) throws IOException { if (_ishut) @@ -241,9 +225,7 @@ return len; } - /* (non-Javadoc) - * @see org.eclipse.io.EndPoint#flush(org.eclipse.io.Buffer) - */ + @Override public int flush(Buffer buffer) throws IOException { Buffer buf = buffer.buffer(); @@ -284,9 +266,7 @@ return len; } - /* (non-Javadoc) - * @see org.eclipse.io.EndPoint#flush(org.eclipse.io.Buffer, org.eclipse.io.Buffer, org.eclipse.io.Buffer) - */ + @Override public int flush(Buffer header, Buffer buffer, Buffer trailer) throws IOException { int length=0; @@ -321,7 +301,7 @@ return length; } - protected int gatheringFlush(Buffer header, ByteBuffer bbuf0, Buffer buffer, ByteBuffer bbuf1) throws IOException + private int gatheringFlush(Buffer header, ByteBuffer bbuf0, Buffer buffer, ByteBuffer bbuf1) throws IOException { int length; @@ -355,110 +335,67 @@ return length; } - /* ------------------------------------------------------------ */ - /** - * @return Returns the channel. - */ - public ByteChannel getChannel() + public final SocketChannel getChannel() { return _channel; } - - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.io.EndPoint#getLocalAddr() - */ - public String getLocalAddr() + @Override + public final String getLocalAddr() { - if (_socket==null) - return null; - if (_local==null || _local.getAddress()==null || _local.getAddress().isAnyLocalAddress()) + if (_local.getAddress()==null || _local.getAddress().isAnyLocalAddress()) return StringUtil.ALL_INTERFACES; return _local.getAddress().getHostAddress(); } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.io.EndPoint#getLocalHost() - */ - public String getLocalHost() + @Override + public final String getLocalHost() { - if (_socket==null) - return null; - if (_local==null || _local.getAddress()==null || _local.getAddress().isAnyLocalAddress()) + if (_local.getAddress()==null || _local.getAddress().isAnyLocalAddress()) return StringUtil.ALL_INTERFACES; return _local.getAddress().getCanonicalHostName(); } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.io.EndPoint#getLocalPort() - */ - public int getLocalPort() + @Override + public final int getLocalPort() { - if (_socket==null) - return 0; - if (_local==null) - return -1; return _local.getPort(); } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.io.EndPoint#getRemoteAddr() - */ - public String getRemoteAddr() + @Override + public final String getRemoteAddr() { - if (_socket==null) - return null; - if (_remote==null) - return null; return _remote.getAddress().getHostAddress(); } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.io.EndPoint#getRemoteHost() - */ - public String getRemoteHost() + @Override + public final String getRemoteHost() { - if (_socket==null) - return null; - if (_remote==null) - return null; return _remote.getAddress().getCanonicalHostName(); } - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.io.EndPoint#getRemotePort() - */ - public int getRemotePort() + @Override + public final int getRemotePort() { - if (_socket==null) - return 0; - return _remote==null?-1:_remote.getPort(); + return _remote.getPort(); } - public Object getTransport() - { - return _channel; - } - + @Override public void flush() throws IOException { } - public int getMaxIdleTime() + @Override + public final int getMaxIdleTime() { return _maxIdleTime; } + @Override public void setMaxIdleTime(int timeMs) throws IOException { - if (_socket!=null && timeMs!=_maxIdleTime) + if (timeMs!=_maxIdleTime) _socket.setSoTimeout(timeMs>0?timeMs:0); _maxIdleTime=timeMs; }
--- a/src/org/eclipse/jetty/io/nio/SslConnection.java Sun Oct 16 01:31:05 2016 -0600 +++ b/src/org/eclipse/jetty/io/nio/SslConnection.java Sun Oct 16 14:53:43 2016 -0600 @@ -20,6 +20,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; import java.util.concurrent.atomic.AtomicBoolean; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngineResult; @@ -667,9 +668,9 @@ return _endp.isOpen(); } - public Object getTransport() + public SocketChannel getChannel() { - return _endp; + return _endp.getChannel(); } public void flush() throws IOException
--- a/src/org/eclipse/jetty/server/AsyncHttpConnection.java Sun Oct 16 01:31:05 2016 -0600 +++ b/src/org/eclipse/jetty/server/AsyncHttpConnection.java Sun Oct 16 14:53:43 2016 -0600 @@ -145,7 +145,7 @@ { LOG.warn("Closing EndPoint making no progress: "+_total_no_progress+" "+_endp+" "+this); if (_endp instanceof SelectChannelEndPoint) - ((SelectChannelEndPoint)_endp).getChannel().close(); + _endp.getChannel().close(); } } }
--- a/src/org/eclipse/jetty/server/nio/BlockingChannelConnector.java Sun Oct 16 01:31:05 2016 -0600 +++ b/src/org/eclipse/jetty/server/nio/BlockingChannelConnector.java Sun Oct 16 14:53:43 2016 -0600 @@ -138,7 +138,7 @@ { super.customize(endpoint, request); endpoint.setMaxIdleTime(_maxIdleTime); - configure(((SocketChannel)endpoint.getTransport()).socket()); + configure(endpoint.getChannel().socket()); } @@ -148,7 +148,7 @@ private int _timeout; private volatile long _idleTimestamp; - BlockingChannelEndPoint(ByteChannel channel) + BlockingChannelEndPoint(SocketChannel channel) throws IOException { super(channel,BlockingChannelConnector.this._maxIdleTime);