Author: markt Date: Mon Nov 10 16:47:19 2014 New Revision: 1637934 URL: http://svn.apache.org/r1637934 Log: Push write methods down to SocketWrapper for NIO
Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioServletOutputStream.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioServletOutputStream.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioServletOutputStream.java?rev=1637934&r1=1637933&r2=1637934&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioServletOutputStream.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioServletOutputStream.java Mon Nov 10 16:47:19 2014 @@ -17,118 +17,28 @@ package org.apache.coyote.http11.upgrade; import java.io.IOException; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; import org.apache.tomcat.util.net.NioChannel; -import org.apache.tomcat.util.net.NioEndpoint; -import org.apache.tomcat.util.net.NioSelectorPool; +import org.apache.tomcat.util.net.NioEndpoint.NioSocketWrapper; import org.apache.tomcat.util.net.SocketWrapperBase; public class NioServletOutputStream extends AbstractServletOutputStream<NioChannel> { - private final NioChannel channel; - private final NioSelectorPool pool; - private final int maxWrite; - - public NioServletOutputStream(SocketWrapperBase<NioChannel> socketWrapper, int asyncWriteBufferSize) { super(socketWrapper, asyncWriteBufferSize); - channel = socketWrapper.getSocket(); - this.pool = ((NioEndpoint) socketWrapper.getEndpoint()).getSelectorPool(); - maxWrite = channel.getBufHandler().getWriteBuffer().capacity(); } @Override protected int doWrite(boolean block, byte[] b, int off, int len) throws IOException { - int leftToWrite = len; - int count = 0; - int offset = off; - - while (leftToWrite > 0) { - int writeThisLoop; - int writtenThisLoop; - - if (leftToWrite > maxWrite) { - writeThisLoop = maxWrite; - } else { - writeThisLoop = leftToWrite; - } - - writtenThisLoop = doWriteInternal(block, b, offset, writeThisLoop); - count += writtenThisLoop; - offset += writtenThisLoop; - leftToWrite -= writtenThisLoop; - - if (writtenThisLoop < writeThisLoop) { - break; - } - } - - return count; - } - - private int doWriteInternal (boolean block, byte[] b, int off, int len) - throws IOException { - channel.getBufHandler().getWriteBuffer().clear(); - channel.getBufHandler().getWriteBuffer().put(b, off, len); - channel.getBufHandler().getWriteBuffer().flip(); - - int written = 0; - NioEndpoint.NioSocketWrapper att = - (NioEndpoint.NioSocketWrapper) channel.getAttachment(false); - if (att == null) { - throw new IOException("Key must be cancelled"); - } - long writeTimeout = att.getWriteTimeout(); - Selector selector = null; - try { - selector = pool.get(); - } catch ( IOException x ) { - //ignore - } - try { - written = pool.write(channel.getBufHandler().getWriteBuffer(), - channel, selector, writeTimeout, block); - } finally { - if (selector != null) { - pool.put(selector); - } - } - if (written < len) { - channel.getPoller().add(channel, SelectionKey.OP_WRITE); - } - return written; + return ((NioSocketWrapper) socketWrapper).write(block, b, off, len); } @Override protected void doFlush() throws IOException { - NioEndpoint.NioSocketWrapper att = - (NioEndpoint.NioSocketWrapper) channel.getAttachment(false); - if (att == null) { - throw new IOException("Key must be cancelled"); - } - long writeTimeout = att.getWriteTimeout(); - Selector selector = null; - try { - selector = pool.get(); - } catch ( IOException x ) { - //ignore - } - try { - do { - if (channel.flush(true, selector, writeTimeout)) { - break; - } - } while (true); - } finally { - if (selector != null) { - pool.put(selector); - } - } + ((NioSocketWrapper) socketWrapper).flush(); } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1637934&r1=1637933&r2=1637934&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Mon Nov 10 16:47:19 2014 @@ -1319,9 +1319,11 @@ public class NioEndpoint extends Abstrac } } -// ----------------------------------------------------- Key Attachment Class + // ---------------------------------------------------- Key Attachment Class public static class NioSocketWrapper extends SocketWrapperBase<NioChannel> { + private final int maxWrite; + private Poller poller = null; private int interestOps = 0; private boolean callBackNotify = false; @@ -1332,6 +1334,7 @@ public class NioEndpoint extends Abstrac public NioSocketWrapper(NioChannel channel, NioEndpoint endpoint) { super(channel, endpoint); + maxWrite = channel.getBufHandler().getWriteBuffer().capacity(); } public void reset(Poller poller, NioChannel channel, long soTimeout) { @@ -1513,8 +1516,101 @@ public class NioEndpoint extends Abstrac return nRead; } + + public int write(boolean block, byte[] b, int off, int len) + throws IOException { + int leftToWrite = len; + int count = 0; + int offset = off; + + while (leftToWrite > 0) { + int writeThisLoop; + int writtenThisLoop; + + if (leftToWrite > maxWrite) { + writeThisLoop = maxWrite; + } else { + writeThisLoop = leftToWrite; + } + + writtenThisLoop = writeInternal(block, b, offset, writeThisLoop); + count += writtenThisLoop; + offset += writtenThisLoop; + leftToWrite -= writtenThisLoop; + + if (writtenThisLoop < writeThisLoop) { + break; + } + } + + return count; + } + + + private int writeInternal (boolean block, byte[] b, int off, int len) + throws IOException { + getSocket().getBufHandler().getWriteBuffer().clear(); + getSocket().getBufHandler().getWriteBuffer().put(b, off, len); + getSocket().getBufHandler().getWriteBuffer().flip(); + + int written = 0; + NioEndpoint.NioSocketWrapper att = + (NioEndpoint.NioSocketWrapper) getSocket().getAttachment(false); + if (att == null) { + throw new IOException("Key must be cancelled"); + } + long writeTimeout = att.getWriteTimeout(); + NioSelectorPool pool = ((NioEndpoint) getEndpoint()).getSelectorPool(); + Selector selector = null; + try { + selector = pool.get(); + } catch ( IOException x ) { + //ignore + } + try { + written = pool.write(getSocket().getBufHandler().getWriteBuffer(), + getSocket(), selector, writeTimeout, block); + } finally { + if (selector != null) { + pool.put(selector); + } + } + if (written < len) { + getSocket().getPoller().add(getSocket(), SelectionKey.OP_WRITE); + } + return written; + } + + + public void flush() throws IOException { + NioEndpoint.NioSocketWrapper att = + (NioEndpoint.NioSocketWrapper) getSocket().getAttachment(false); + if (att == null) { + throw new IOException("Key must be cancelled"); + } + long writeTimeout = att.getWriteTimeout(); + NioSelectorPool pool = ((NioEndpoint) getEndpoint()).getSelectorPool(); + Selector selector = null; + try { + selector = pool.get(); + } catch ( IOException x ) { + //ignore + } + try { + do { + if (getSocket().flush(true, selector, writeTimeout)) { + break; + } + } while (true); + } finally { + if (selector != null) { + pool.put(selector); + } + } + } } + // ------------------------------------------------ Application Buffer Handler public static class NioBufferHandler implements ApplicationBufferHandler { private ByteBuffer readbuf = null; --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org