remm 2005/05/14 13:41:26
Modified: http11/src/java/org/apache/coyote/http11
InternalAprOutputBuffer.java
Log:
- Optimize a little using a direct byte buffer to replace the socket buffer.
- I'll experiment with doing the same optimization for reads, but I don't
expect it to do anything
(other than waste memory) as copying bytes will be needed.
Revision Changes Path
1.3 +25 -45
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalAprOutputBuffer.java
Index: InternalAprOutputBuffer.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalAprOutputBuffer.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- InternalAprOutputBuffer.java 20 Apr 2005 16:13:23 -0000 1.2
+++ InternalAprOutputBuffer.java 14 May 2005 20:41:26 -0000 1.3
@@ -17,6 +17,7 @@
package org.apache.coyote.http11;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -38,7 +39,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Remy Maucherat</a>
*/
public class InternalAprOutputBuffer
- implements OutputBuffer, ByteChunk.ByteOutputChannel {
+ implements OutputBuffer {
// --------------------------------------------------------------
Constants
@@ -66,15 +67,14 @@
headerBuffer = new byte[headerBufferSize];
buf = headerBuffer;
+ bbuf = ByteBuffer.allocateDirect((headerBufferSize / 1500 + 1) *
1500);
+
outputStreamOutputBuffer = new SocketOutputBuffer();
filterLibrary = new OutputFilter[0];
activeFilters = new OutputFilter[0];
lastActiveFilter = -1;
- socketBuffer = new ByteChunk();
- socketBuffer.setByteOutputChannel(this);
-
committed = false;
finished = false;
@@ -168,17 +168,11 @@
/**
- * Socket buffer.
- */
- protected ByteChunk socketBuffer;
-
-
- /**
- * Socket buffer (extra buffering to reduce number of packets sent).
+ * Direct byte buffer used for writing.
*/
- protected boolean useSocketBuffer = false;
-
+ protected ByteBuffer bbuf = null;
+
// -------------------------------------------------------------
Properties
@@ -202,14 +196,7 @@
* Set the socket buffer size.
*/
public void setSocketBuffer(int socketBufferSize) {
-
- if (socketBufferSize > 500) {
- useSocketBuffer = true;
- socketBuffer.allocate(socketBufferSize, socketBufferSize);
- } else {
- useSocketBuffer = false;
- }
-
+ // FIXME: Remove
}
@@ -295,9 +282,7 @@
}
// Flush the current buffer
- if (useSocketBuffer) {
- socketBuffer.flushBuffer();
- }
+ flushBuffer();
}
@@ -326,7 +311,7 @@
// Recycle Request object
response.recycle();
- socketBuffer.recycle();
+ bbuf.clear();
socket = 0;
buf = headerBuffer;
@@ -348,7 +333,6 @@
// Recycle Request object
response.recycle();
- socketBuffer.recycle();
// Determine the header buffer used for next request
buf = headerBuffer;
@@ -390,9 +374,7 @@
if (lastActiveFilter != -1)
activeFilters[lastActiveFilter].end();
- if (useSocketBuffer) {
- socketBuffer.flushBuffer();
- }
+ flushBuffer();
finished = true;
@@ -595,12 +577,7 @@
if (pos > 0) {
// Sending the response header buffer
- if (useSocketBuffer) {
- socketBuffer.append(buf, 0, pos);
- } else {
- if (Socket.send(socket, buf, 0, pos) < 0)
- throw new IOException(sm.getString("iib.failedwrite"));
- }
+ bbuf.put(buf, 0, pos);
}
}
@@ -738,11 +715,13 @@
/**
* Callback to write data from the buffer.
*/
- public void realWriteBytes(byte[] buf, int off, int len)
+ protected void flushBuffer()
throws IOException {
- if (len > 0) {
- if (Socket.send(socket, buf, off, len) < 0)
+ if (bbuf.position() > 0) {
+ if (Socket.sendb(socket, bbuf, 0, bbuf.position()) < 0) {
throw new IOException(sm.getString("iib.failedwrite"));
+ }
+ bbuf.clear();
}
}
@@ -764,14 +743,15 @@
public int doWrite(ByteChunk chunk, Response res)
throws IOException {
- if (useSocketBuffer) {
- socketBuffer.append(chunk.getBuffer(), chunk.getStart(),
- chunk.getLength());
- } else {
- if (Socket.send(socket, chunk.getBuffer(), chunk.getStart(),
- chunk.getLength()) < 0)
- throw new IOException(sm.getString("iib.failedwrite"));
+ if (bbuf.position() + chunk.getLength() > bbuf.capacity()) {
+ flushBuffer();
+ if (chunk.getLength() > bbuf.capacity()) {
+ if (Socket.send(socket, chunk.getBuffer(),
chunk.getStart(),
+ chunk.getLength()) < 0)
+ throw new
IOException(sm.getString("iib.failedwrite"));
+ }
}
+ bbuf.put(chunk.getBuffer(), chunk.getStart(), chunk.getLength());
return chunk.getLength();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]