From f0a4c30f7ea310db4eada2031b9630655687e67f Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Thu, 11 Mar 2004 14:41:47 +0000 Subject: BufferedInputStream.java (marktarget): New field for max mark limit. 2004-03-11 Guilhem Lavaux * java/io/BufferedInputStream.java (marktarget): New field for max mark limit. (CHUNKSIZE): New constant for incremental mark buffer allocation. (mark): Use new fields. (read): Likewise. (read(byte[],int,int)): Likewise. (skip): Likewise. (refill): Likewise. From-SVN: r79326 --- libjava/java/io/BufferedInputStream.java | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'libjava/java/io/BufferedInputStream.java') diff --git a/libjava/java/io/BufferedInputStream.java b/libjava/java/io/BufferedInputStream.java index 8c27e89..cd8e681 100644 --- a/libjava/java/io/BufferedInputStream.java +++ b/libjava/java/io/BufferedInputStream.java @@ -103,6 +103,19 @@ public class BufferedInputStream extends FilterInputStream protected int marklimit = 0; /** + * This is the maximum size we have to allocate for the mark buffer. + * This number may be huge (Integer.MAX_VALUE). The class will continue + * to allocate new chunks (specified by CHUNKSIZE) until the + * the size specified by this field is achieved. + */ + private int marktarget = 0; + + /** + * This is the number of bytes to allocate to reach marktarget. + */ + static final private int CHUNKSIZE = 1024; + + /** * This method initializes a new BufferedInputStream that will * read from the specified subordinate stream with a default buffer size * of 2048 bytes @@ -183,7 +196,9 @@ public class BufferedInputStream extends FilterInputStream */ public synchronized void mark(int readlimit) { - marklimit = readlimit; + marktarget = marklimit = readlimit; + if (marklimit > CHUNKSIZE) + marklimit = CHUNKSIZE; markpos = pos; } @@ -216,7 +231,7 @@ public class BufferedInputStream extends FilterInputStream if (pos >= count && !refill()) return -1; // EOF - if (markpos >= 0 && pos - markpos > marklimit) + if (markpos >= 0 && pos - markpos > marktarget) markpos = -1; return ((int) buf[pos++]) & 0xFF; @@ -255,7 +270,7 @@ public class BufferedInputStream extends FilterInputStream System.arraycopy(buf, pos, b, off, remain); pos += remain; - if (markpos >= 0 && pos - markpos > marklimit) + if (markpos >= 0 && pos - markpos > marktarget) markpos = -1; return remain; @@ -309,7 +324,7 @@ public class BufferedInputStream extends FilterInputStream pos += numread; n -= numread; - if (markpos >= 0 && pos - markpos > marklimit) + if (markpos >= 0 && pos - markpos > marktarget) markpos = -1; } @@ -337,13 +352,16 @@ public class BufferedInputStream extends FilterInputStream pos -= markpos; markpos = 0; } - else if (marklimit >= buf.length) // BTW, markpos == 0 + else if (marktarget >= buf.length && marklimit < 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. // This is so that there will be one byte past marklimit to be read // before having to call refill again, thus allowing marklimit to be // invalidated. That way refill doesn't have to check marklimit. + marklimit += CHUNKSIZE; + if (marklimit >= marktarget) + marklimit = marktarget; byte[] newbuf = new byte[marklimit + 1]; System.arraycopy(buf, 0, newbuf, 0, count); buf = newbuf; -- cgit v1.1