You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/01/08 14:09:31 UTC
svn commit: r1650265 - in /tomcat/trunk: java/org/apache/coyote/http11/
test/org/apache/coyote/http11/filters/
Author: markt
Date: Thu Jan 8 13:09:31 2015
New Revision: 1650265
URL: http://svn.apache.org/r1650265
Log:
Add SocketWrapper to AbstractOutputBuffer.
While this allows a little code reduction now, the primary reason for
this is a step towards the goal of having a single OutputBuffer
implementation with the APR/NIO/NIO2 code moving to the SocketWrapper or
Endpoint as appropriate.
Modified:
tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java
tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java
Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1650265&r1=1650264&r2=1650265&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Thu Jan 8 13:09:31 2015
@@ -939,7 +939,7 @@ public abstract class AbstractHttp11Proc
// Setting up the I/O
setSocketWrapper(socketWrapper);
getInputBuffer().init(socketWrapper, endpoint);
- getOutputBuffer().init(socketWrapper, endpoint);
+ getOutputBuffer().init(socketWrapper);
// Flags
keepAlive = true;
Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java Thu Jan 8 13:09:31 2015
@@ -33,7 +33,6 @@ import org.apache.juli.logging.LogFactor
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.http.HttpMessages;
-import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.SocketWrapperBase;
import org.apache.tomcat.util.res.StringManager;
@@ -96,6 +95,12 @@ public abstract class AbstractOutputBuff
protected OutputBuffer outputStreamOutputBuffer;
/**
+ * Wrapper for socket where data will be written to.
+ */
+ protected SocketWrapperBase<S> socketWrapper;
+
+
+ /**
* Bytes written to client for the current request
*/
protected long byteCount = 0;
@@ -316,6 +321,7 @@ public abstract class AbstractOutputBuff
public void recycle() {
// Sub-classes may wish to do more than this.
nextRequest();
+ socketWrapper = null;
bufferedWrites.clear();
writeBufferFlipped = false;
}
@@ -368,8 +374,10 @@ public abstract class AbstractOutputBuff
}
- public abstract void init(SocketWrapperBase<S> socketWrapper,
- AbstractEndpoint<S> endpoint) throws IOException;
+ public void init(SocketWrapperBase<S> socketWrapper) {
+ this.socketWrapper = socketWrapper;
+ }
+
public abstract void sendAck() throws IOException;
Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java Thu Jan 8 13:09:31 2015
@@ -64,21 +64,16 @@ public class InternalAprOutputBuffer ext
private long socket;
- private SocketWrapperBase<Long> wrapper;
-
-
private AbstractEndpoint<Long> endpoint;
// --------------------------------------------------------- Public Methods
@Override
- public void init(SocketWrapperBase<Long> socketWrapper,
- AbstractEndpoint<Long> endpoint) throws IOException {
-
- wrapper = socketWrapper;
+ public void init(SocketWrapperBase<Long> socketWrapper) {
+ super.init(socketWrapper);
socket = socketWrapper.getSocket().longValue();
- this.endpoint = endpoint;
+ this.endpoint = socketWrapper.getEndpoint();
Socket.setsbb(this.socket, socketWriteBuffer);
}
@@ -93,7 +88,6 @@ public class InternalAprOutputBuffer ext
super.recycle();
socketWriteBuffer.clear();
socket = 0;
- wrapper = null;
}
@@ -191,12 +185,12 @@ public class InternalAprOutputBuffer ext
private synchronized void writeToSocket(boolean block) throws IOException {
- Lock readLock = wrapper.getBlockingStatusReadLock();
- WriteLock writeLock = wrapper.getBlockingStatusWriteLock();
+ Lock readLock = socketWrapper.getBlockingStatusReadLock();
+ WriteLock writeLock = socketWrapper.getBlockingStatusWriteLock();
readLock.lock();
try {
- if (wrapper.getBlockingStatus() == block) {
+ if (socketWrapper.getBlockingStatus() == block) {
writeToSocket();
return;
}
@@ -207,7 +201,7 @@ public class InternalAprOutputBuffer ext
writeLock.lock();
try {
// Set the current settings for this socket
- wrapper.setBlockingStatus(block);
+ socketWrapper.setBlockingStatus(block);
if (block) {
Socket.timeoutSet(socket, endpoint.getSoTimeout() * 1000);
} else {
Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java Thu Jan 8 13:09:31 2015
@@ -54,11 +54,6 @@ public class InternalNio2OutputBuffer ex
private static final ByteBuffer[] EMPTY_BUF_ARRAY = new ByteBuffer[0];
/**
- * Underlying socket.
- */
- private SocketWrapperBase<Nio2Channel> socket;
-
- /**
* Track write interest
*/
protected volatile boolean interest = false;
@@ -96,11 +91,10 @@ public class InternalNio2OutputBuffer ex
// --------------------------------------------------------- Public Methods
@Override
- public void init(SocketWrapperBase<Nio2Channel> socketWrapper,
- AbstractEndpoint<Nio2Channel> associatedEndpoint) throws IOException {
- this.socket = socketWrapper;
- this.endpoint = associatedEndpoint;
- this.socketWriteBuffer = socket.getSocket().getBufHandler().getWriteBuffer();
+ public void init(SocketWrapperBase<Nio2Channel> socketWrapper) {
+ super.init(socketWrapper);
+ this.endpoint = socketWrapper.getEndpoint();
+ this.socketWriteBuffer = socketWrapper.getSocket().getBufHandler().getWriteBuffer();
this.completionHandler = new CompletionHandler<Integer, ByteBuffer>() {
@Override
@@ -121,12 +115,12 @@ public class InternalNio2OutputBuffer ex
}
bufferedWrites.clear();
ByteBuffer[] array = arrayList.toArray(EMPTY_BUF_ARRAY);
- socket.getSocket().write(array, 0, array.length,
- socket.getTimeout(), TimeUnit.MILLISECONDS,
+ socketWrapper.getSocket().write(array, 0, array.length,
+ socketWrapper.getTimeout(), TimeUnit.MILLISECONDS,
array, gatherCompletionHandler);
} else if (attachment.hasRemaining()) {
// Regular write
- socket.getSocket().write(attachment, socket.getTimeout(),
+ socketWrapper.getSocket().write(attachment, socketWrapper.getTimeout(),
TimeUnit.MILLISECONDS, attachment, completionHandler);
} else {
// All data has been written
@@ -138,13 +132,13 @@ public class InternalNio2OutputBuffer ex
}
}
if (notify) {
- endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, false);
+ endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, false);
}
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
- socket.setError(true);
+ socketWrapper.setError(true);
if (exc instanceof IOException) {
e = (IOException) exc;
} else {
@@ -152,7 +146,7 @@ public class InternalNio2OutputBuffer ex
}
response.getRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION, e);
writePending.release();
- endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, true);
+ endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, true);
}
};
this.gatherCompletionHandler = new CompletionHandler<Long, ByteBuffer[]>() {
@@ -176,8 +170,8 @@ public class InternalNio2OutputBuffer ex
}
bufferedWrites.clear();
ByteBuffer[] array = arrayList.toArray(EMPTY_BUF_ARRAY);
- socket.getSocket().write(array, 0, array.length,
- socket.getTimeout(), TimeUnit.MILLISECONDS,
+ socketWrapper.getSocket().write(array, 0, array.length,
+ socketWrapper.getTimeout(), TimeUnit.MILLISECONDS,
array, gatherCompletionHandler);
} else {
// All data has been written
@@ -189,13 +183,13 @@ public class InternalNio2OutputBuffer ex
}
}
if (notify) {
- endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, false);
+ endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, false);
}
}
@Override
public void failed(Throwable exc, ByteBuffer[] attachment) {
- socket.setError(true);
+ socketWrapper.setError(true);
if (exc instanceof IOException) {
e = (IOException) exc;
} else {
@@ -203,7 +197,7 @@ public class InternalNio2OutputBuffer ex
}
response.getRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION, e);
writePending.release();
- endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, true);
+ endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, true);
}
};
}
@@ -216,7 +210,6 @@ public class InternalNio2OutputBuffer ex
@Override
public void recycle() {
super.recycle();
- socket = null;
e = null;
interest = false;
if (writePending.availablePermits() != 1) {
@@ -264,7 +257,7 @@ public class InternalNio2OutputBuffer ex
if (length == 0)
return;
- if (socket == null || socket.getSocket() == null)
+ if (socketWrapper == null || socketWrapper.getSocket() == null)
return;
if (isBlocking()) {
@@ -284,7 +277,7 @@ public class InternalNio2OutputBuffer ex
// Also allows doing autoblocking
// Could be "smart" with coordination with the main CoyoteOutputStream to
// indicate the end of a write
- // Uses: if (writePending.tryAcquire(socket.getTimeout(), TimeUnit.MILLISECONDS))
+ // Uses: if (writePending.tryAcquire(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS))
if (writePending.tryAcquire()) {
synchronized (completionHandler) {
// No pending completion handler, so writing to the main buffer
@@ -326,7 +319,7 @@ public class InternalNio2OutputBuffer ex
}
private boolean flushBufferInternal(boolean block, boolean hasPermit) throws IOException {
- if (socket == null || socket.getSocket() == null)
+ if (socketWrapper == null || socketWrapper.getSocket() == null)
return false;
if (block) {
@@ -334,7 +327,7 @@ public class InternalNio2OutputBuffer ex
// The final flush is blocking, but the processing was using
// non blocking so wait until an async write is done
try {
- if (writePending.tryAcquire(socket.getTimeout(), TimeUnit.MILLISECONDS)) {
+ if (writePending.tryAcquire(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS)) {
writePending.release();
}
} catch (InterruptedException e) {
@@ -346,7 +339,7 @@ public class InternalNio2OutputBuffer ex
for (ByteBuffer buffer : bufferedWrites) {
buffer.flip();
while (buffer.hasRemaining()) {
- if (socket.getSocket().write(buffer).get(socket.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) {
+ if (socketWrapper.getSocket().write(buffer).get(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) {
throw new EOFException(sm.getString("iob.failedwrite"));
}
}
@@ -358,7 +351,7 @@ public class InternalNio2OutputBuffer ex
writeBufferFlipped = true;
}
while (socketWriteBuffer.hasRemaining()) {
- if (socket.getSocket().write(socketWriteBuffer).get(socket.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) {
+ if (socketWrapper.getSocket().write(socketWriteBuffer).get(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) {
throw new EOFException(sm.getString("iob.failedwrite"));
}
}
@@ -396,11 +389,11 @@ public class InternalNio2OutputBuffer ex
}
bufferedWrites.clear();
ByteBuffer[] array = arrayList.toArray(EMPTY_BUF_ARRAY);
- socket.getSocket().write(array, 0, array.length, socket.getTimeout(),
+ socketWrapper.getSocket().write(array, 0, array.length, socketWrapper.getTimeout(),
TimeUnit.MILLISECONDS, array, gatherCompletionHandler);
} else if (socketWriteBuffer.hasRemaining()) {
// Regular write
- socket.getSocket().write(socketWriteBuffer, socket.getTimeout(),
+ socketWrapper.getSocket().write(socketWriteBuffer, socketWrapper.getTimeout(),
TimeUnit.MILLISECONDS, socketWriteBuffer, completionHandler);
} else {
// Nothing was written
@@ -439,7 +432,7 @@ public class InternalNio2OutputBuffer ex
interest = true;
} else {
// If no write is pending, notify
- endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, true);
+ endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, true);
}
}
}
Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java Thu Jan 8 13:09:31 2015
@@ -25,7 +25,6 @@ import java.util.Iterator;
import org.apache.coyote.ByteBufferHolder;
import org.apache.coyote.Response;
-import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.NioChannel;
import org.apache.tomcat.util.net.NioEndpoint;
import org.apache.tomcat.util.net.NioSelectorPool;
@@ -62,11 +61,10 @@ public class InternalNioOutputBuffer ext
// --------------------------------------------------------- Public Methods
@Override
- public void init(SocketWrapperBase<NioChannel> socketWrapper,
- AbstractEndpoint<NioChannel> endpoint) throws IOException {
-
+ public void init(SocketWrapperBase<NioChannel> socketWrapper) {
+ super.init(socketWrapper);
socket = socketWrapper.getSocket();
- pool = ((NioEndpoint)endpoint).getSelectorPool();
+ pool = ((NioEndpoint)socketWrapper.getEndpoint()).getSelectorPool();
socketWriteBuffer = socket.getBufHandler().getWriteBuffer();
}
@@ -170,8 +168,8 @@ public class InternalNioOutputBuffer ext
}
}
- NioEndpoint.NioSocketWrapper ka = (NioEndpoint.NioSocketWrapper)socket.getAttachment();
- if (ka != null) ka.access();//prevent timeouts for just doing client writes
+ // Prevent timeouts for just doing client writes
+ socketWrapper.access();
if (!isBlocking() && length > 0) {
// Remaining data must be buffered
Modified: tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java Thu Jan 8 13:09:31 2015
@@ -24,7 +24,6 @@ import org.apache.coyote.OutputBuffer;
import org.apache.coyote.Response;
import org.apache.coyote.http11.AbstractOutputBuffer;
import org.apache.tomcat.util.buf.ByteChunk;
-import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.SocketWrapperBase;
/**
@@ -47,8 +46,7 @@ public class TesterOutputBuffer extends
// --------------------------------------------------------- Public Methods
@Override
- public void init(SocketWrapperBase<Socket> socketWrapper,
- AbstractEndpoint<Socket> endpoint) throws IOException {
+ public void init(SocketWrapperBase<Socket> socketWrapper) {
// NO-OP: Unused
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org