diff options
author | Guilhem Lavaux <guilhem@kaffe.org> | 2004-03-11 14:41:47 +0000 |
---|---|---|
committer | Michael Koch <mkoch@gcc.gnu.org> | 2004-03-11 14:41:47 +0000 |
commit | f0a4c30f7ea310db4eada2031b9630655687e67f (patch) | |
tree | f7fbed2c53118efcbff37a49ff39a94a24397607 /libjava/java/io | |
parent | 6bbec498e5aba91b69c9b8060266042924321d4e (diff) | |
download | gcc-f0a4c30f7ea310db4eada2031b9630655687e67f.zip gcc-f0a4c30f7ea310db4eada2031b9630655687e67f.tar.gz gcc-f0a4c30f7ea310db4eada2031b9630655687e67f.tar.bz2 |
BufferedInputStream.java (marktarget): New field for max mark limit.
2004-03-11 Guilhem Lavaux <guilhem@kaffe.org>
* 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
Diffstat (limited to 'libjava/java/io')
-rw-r--r-- | libjava/java/io/BufferedInputStream.java | 28 |
1 files changed, 23 insertions, 5 deletions
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 <code>CHUNKSIZE</code>) 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 <code>BufferedInputStream</code> 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; |