remm        2003/09/12 05:58:53

  Modified:    util/java/org/apache/tomcat/util/buf ByteChunk.java
  Log:
  - Refactor byte chunk buffering so that the written data fits inside the limit.
    The number of byte copies is similar to what it was before.
  
  Revision  Changes    Path
  1.15      +19 -28    
jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/ByteChunk.java
  
  Index: ByteChunk.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/buf/ByteChunk.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ByteChunk.java    2 Sep 2003 21:34:38 -0000       1.14
  +++ ByteChunk.java    12 Sep 2003 12:58:53 -0000      1.15
  @@ -338,34 +338,25 @@
   
        // the buffer is already at ( or bigger than ) limit
   
  -     // Optimization:
  -     // If len-avail < length ( i.e. after we fill the buffer with
  -     // what we can, the remaining will fit in the buffer ) we'll just
  -     // copy the first part, flush, then copy the second part - 1 write
  -     // and still have some space for more. We'll still have 2 writes, but
  -     // we write more on the first.
  -
  -     if( len + end < 2 * limit ) {
  -         /* If the request length exceeds the size of the output buffer,
  -            flush the output buffer and then write the data directly.
  -            We can't avoid 2 writes, but we can write more on the second
  -         */
  -         int avail=limit-end;
  -         System.arraycopy(src, off, buff, end, avail);
  -         end += avail;
  -
  -         flushBuffer();
  -
  -         System.arraycopy(src, off+avail, buff, end, len - avail);
  -         end+= len - avail;
  -
  -     } else {        // len > buf.length + avail
  -         // long write - flush the buffer and write the rest
  -         // directly from source
  -         flushBuffer();
  -         
  -         out.realWriteBytes( src, off, len );
  -     }
  +        // We chunk the data into slices fitting in the buffer limit, although
  +        // if the data is written directly if it doesn't fit
  +
  +        int avail=limit-end;
  +        System.arraycopy(src, off, buff, end, avail);
  +        end += avail;
  +
  +        flushBuffer();
  +
  +        int remain = len - avail;
  +
  +        while (remain > (limit - end)) {
  +            out.realWriteBytes( src, (off + len) - remain, limit - end );
  +            remain = remain - (limit - end);
  +        }
  +
  +        System.arraycopy(src, (off + len) - remain, buff, end, remain);
  +        end += remain;
  +
       }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to