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]

Reply via email to