Patch: FYI: fix PR 18840

Tom Tromey tromey@redhat.com
Tue Jan 11 20:03:00 GMT 2005


I'm checking this in.

This fixes PR 18840.  I didn't just use the Classpath code since this
would require more work -- InputStreamReader uses BufferedInputStream
internals, and InputStreamReader is hard to merge since it means
dealing with charset conversionn.

Tested on x86 FC2 including mauve and jacks.  Also, I started Eclipse
with this patch in place as a stress test (Michael, I believe, told me
that a BufferedInputStream bug can cause eclipse to fail to start).

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	PR libgcj/18840:
	* java/io/BufferedInputStream.java (read): Repeatedly read to
	fill buffer.
	(refill): Change test to see if buffer must be grown.

Index: java/io/BufferedInputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/BufferedInputStream.java,v
retrieving revision 1.10
diff -u -r1.10 BufferedInputStream.java
--- java/io/BufferedInputStream.java 17 Nov 2004 23:51:18 -0000 1.10
+++ java/io/BufferedInputStream.java 11 Jan 2005 19:01:53 -0000
@@ -1,5 +1,5 @@
 /* BufferedInputStream.java -- An input stream that implements buffering
-   Copyright (C) 1998, 1999, 2001, 2004  Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2001, 2004, 2005  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -198,7 +198,7 @@
   {
     marktarget = marklimit = readlimit;
     if (marklimit > CHUNKSIZE)
-	marklimit = CHUNKSIZE;
+      marklimit = CHUNKSIZE;
     markpos = pos;
   }
 
@@ -241,7 +241,10 @@
    * This method reads bytes from a stream and stores them into a caller
    * supplied buffer.  It starts storing the data at index <code>off</code>
    * into the buffer and attempts to read <code>len</code> bytes.  This method
-   * can return before reading the number of bytes requested.
+   * can return before reading the number of bytes requested, but it will try
+   * to read the requested number of bytes by repeatedly calling the underlying
+   * stream as long as available() for this stream continues to return a
+   * non-zero value (or until the requested number of bytes have been read).
    * The actual number of bytes read is returned as an int.  A -1 is returned
    * to indicate the end of the stream.
    * <p>
@@ -263,16 +266,34 @@
     if (off < 0 || len < 0 || b.length - off < len)
       throw new IndexOutOfBoundsException();
 
+    if (len == 0)
+      return 0;
+
     if (pos >= count && !refill())
       return -1;		// No bytes were read before EOF.
 
     int totalBytesRead = Math.min(count - pos, len);
     System.arraycopy(buf, pos, b, off, totalBytesRead);
     pos += totalBytesRead;
+    off += totalBytesRead;
+    len -= totalBytesRead;
 
     if (markpos >= 0 && pos - markpos > marktarget)
       markpos = -1;
 
+    while (len > 0 && super.available() > 0 && refill())
+      {
+	int remain = Math.min(count - pos, len);
+	System.arraycopy(buf, pos, b, off, remain);
+	pos += remain;
+	off += remain;
+	len -= remain;
+	totalBytesRead += remain;
+
+	if (markpos >= 0 && pos - markpos > marktarget)
+	  markpos = -1;
+      }
+
     return totalBytesRead;
   }
 
@@ -311,7 +332,7 @@
   public synchronized long skip(long n) throws IOException
   {
     if (buf == null)
-	throw new IOException("Stream closed.");
+      throw new IOException("Stream closed.");
 
     final long origN = n;
 
@@ -343,7 +364,7 @@
   boolean refill() throws IOException
   {
     if (buf == null)
-	throw new IOException("Stream closed.");
+      throw new IOException("Stream closed.");
 
     if (markpos < 0)
       count = pos = 0;
@@ -357,7 +378,7 @@
 	pos -= markpos;
 	markpos = 0;
       }
-    else if (marktarget >= buf.length && marklimit < marktarget)	// BTW, markpos == 0
+    else if (count >= buf.length && count < marktarget)	// BTW, markpos == 0
       {
 	// Need to grow the buffer now to have room for marklimit bytes.
 	// Note that the new buffer is one greater than marklimit.
@@ -378,6 +399,6 @@
       return false;
 
     count += numread;
-    return true;
+    return numread > 0;
   }
 }



More information about the Java-patches mailing list