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 2013/05/02 22:57:46 UTC
svn commit: r1478537 - in /tomcat/trunk/java/org/apache/coyote/http11:
AbstractOutputBuffer.java InternalAprOutputBuffer.java
InternalNioOutputBuffer.java InternalOutputBuffer.java
Author: markt
Date: Thu May 2 20:57:45 2013
New Revision: 1478537
URL: http://svn.apache.org/r1478537
Log:
Pull up the buffer that holds non-blocking writes.
This allows setBlocking() to be pulled up and given a common
implementation.
Modified:
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/InternalNioOutputBuffer.java
tomcat/trunk/java/org/apache/coyote/http11/InternalOutputBuffer.java
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=1478537&r1=1478536&r2=1478537&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java Thu May 2 20:57:45 2013
@@ -17,8 +17,11 @@
package org.apache.coyote.http11;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.coyote.ActionCode;
import org.apache.coyote.OutputBuffer;
@@ -100,6 +103,20 @@ public abstract class AbstractOutputBuff
*/
protected int socketBuffer = -1;
+ /**
+ * For "non-blocking" writes use an external set of buffers. Although the
+ * API only allows one non-blocking write at a time, due to buffering and
+ * the possible need to write HTTP headers, there may be more than one write
+ * to the OutputBuffer.
+ */
+ protected volatile LinkedBlockingDeque<ByteBufferHolder> bufferedWrites =
+ null;
+
+ /**
+ * The max size of the buffered write buffer
+ */
+ protected int bufferedWriteSize = 64*1024; //64k default write buffer
+
// -------------------------------------------------------------- Variables
@@ -184,6 +201,16 @@ public abstract class AbstractOutputBuff
}
+ public void setBufferedWriteSize(int bufferedWriteSize) {
+ this.bufferedWriteSize = bufferedWriteSize;
+ }
+
+
+ public int getBufferedWriteSize() {
+ return bufferedWriteSize;
+ }
+
+
// --------------------------------------------------- OutputBuffer Methods
/**
@@ -577,7 +604,6 @@ public abstract class AbstractOutputBuff
//------------------------------------------------------ Non-blocking writes
protected abstract boolean hasDataToWrite();
- protected abstract void setBlocking(boolean blocking);
/**
* Writes any remaining buffered data.
@@ -591,6 +617,17 @@ public abstract class AbstractOutputBuff
/**
+ * Configure the blocking behaviour of the OutputBuffer.
+ */
+ public final void setBlocking(boolean blocking) {
+ if (blocking)
+ bufferedWrites = null;
+ else
+ bufferedWrites = new LinkedBlockingDeque<>();
+ }
+
+
+ /**
* Is standard Servlet blocking IO being used for output?
*/
protected final boolean isBlocking() {
@@ -601,4 +638,48 @@ public abstract class AbstractOutputBuff
protected final boolean isReady() {
return !hasDataToWrite();
}
+
+
+ protected static class ByteBufferHolder {
+ private final ByteBuffer buf;
+ private final AtomicBoolean flipped;
+ public ByteBufferHolder(ByteBuffer buf, boolean flipped) {
+ this.buf = buf;
+ this.flipped = new AtomicBoolean(flipped);
+ }
+ public ByteBuffer getBuf() {
+ return buf;
+ }
+ public boolean isFlipped() {
+ return flipped.get();
+ }
+
+ public boolean flip() {
+ if (flipped.compareAndSet(false, true)) {
+ buf.flip();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean hasData() {
+ if (flipped.get()) {
+ return buf.remaining()>0;
+ } else {
+ return buf.position()>0;
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder(super.toString());
+ builder.append("[flipped=");
+ builder.append(isFlipped()?"true, remaining=" : "false, position=");
+ builder.append(isFlipped()? buf.remaining(): buf.position());
+ builder.append("]");
+ return builder.toString();
+ }
+
+ }
}
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=1478537&r1=1478536&r2=1478537&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java Thu May 2 20:57:45 2013
@@ -174,12 +174,6 @@ public class InternalAprOutputBuffer ext
}
- @Override
- protected void setBlocking(boolean blocking) {
- // TODO
- }
-
-
// ----------------------------------- OutputStreamOutputBuffer Inner Class
/**
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=1478537&r1=1478536&r2=1478537&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java Thu May 2 20:57:45 2013
@@ -22,8 +22,6 @@ import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.coyote.OutputBuffer;
import org.apache.coyote.Response;
@@ -84,59 +82,6 @@ public class InternalNioOutputBuffer ext
*/
protected volatile boolean flipped = false;
- /**
- * For "non-blocking" writes use an external buffer.
- */
- protected volatile LinkedBlockingDeque<ByteBufferHolder> bufferedWrites = null;
-
- /**
- * The max size of the buffered write buffer
- */
- protected int bufferedWriteSize = 64*1024; //64k default write buffer
-
- protected static class ByteBufferHolder {
- private final ByteBuffer buf;
- private final AtomicBoolean flipped;
- public ByteBufferHolder(ByteBuffer buf, boolean flipped) {
- this.buf = buf;
- this.flipped = new AtomicBoolean(flipped);
- }
- public ByteBuffer getBuf() {
- return buf;
- }
- public boolean isFlipped() {
- return flipped.get();
- }
-
- public boolean flip() {
- if (flipped.compareAndSet(false, true)) {
- buf.flip();
- return true;
- } else {
- return false;
- }
- }
-
- public boolean hasData() {
- if (flipped.get()) {
- return buf.remaining()>0;
- } else {
- return buf.position()>0;
- }
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder(super.toString());
- builder.append("[flipped=");
- builder.append(isFlipped()?"true, remaining=" : "false, position=");
- builder.append(isFlipped()? buf.remaining(): buf.position());
- builder.append("]");
- return builder.toString();
- }
-
- }
-
// --------------------------------------------------------- Public Methods
/**
@@ -347,18 +292,6 @@ public class InternalNioOutputBuffer ext
//-------------------------------------------------- Non-blocking IO methods
- @Override
- public void setBlocking(boolean blocking) {
- if (blocking)
- bufferedWrites = null;
- else
- bufferedWrites = new LinkedBlockingDeque<>();
- }
-
- public void setBufferedWriteSize(int bufferedWriteSize) {
- this.bufferedWriteSize = bufferedWriteSize;
- }
-
private boolean hasBufferedData() {
boolean result = false;
if (bufferedWrites!=null) {
@@ -375,10 +308,6 @@ public class InternalNioOutputBuffer ext
return hasMoreDataToFlush() || hasBufferedData();
}
- public int getBufferedWriteSize() {
- return bufferedWriteSize;
- }
-
// ----------------------------------- OutputStreamOutputBuffer Inner Class
Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalOutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalOutputBuffer.java?rev=1478537&r1=1478536&r2=1478537&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalOutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalOutputBuffer.java Thu May 2 20:57:45 2013
@@ -192,12 +192,6 @@ public class InternalOutputBuffer extend
@Override
- protected void setBlocking(boolean blocking) {
- // TODO
- }
-
-
- @Override
protected boolean flushBuffer(boolean block) throws IOException {
// Blocking connector so ignore block parameter as this will always use
// blocking IO.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org