diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-22 00:58:04 -0400 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-22 00:58:04 -0400 |
commit | 0e70fdb9bfb8bae59347f4e3a700db3603e14e04 (patch) | |
tree | 9d219d8db9fa8b5f306b046ca9841184ae09d04c /luni/src | |
parent | d11650725309acf5b9aad1110387b8e42c0f5955 (diff) | |
parent | 801d4e3787d81f759514e99172cb762e38f8c808 (diff) | |
download | libcore-0e70fdb9bfb8bae59347f4e3a700db3603e14e04.zip libcore-0e70fdb9bfb8bae59347f4e3a700db3603e14e04.tar.gz libcore-0e70fdb9bfb8bae59347f4e3a700db3603e14e04.tar.bz2 |
Merge change 26288
* changes:
Cleaning up PipedInputStream.
Diffstat (limited to 'luni/src')
-rw-r--r-- | luni/src/main/java/java/io/PipedInputStream.java | 123 |
1 files changed, 82 insertions, 41 deletions
diff --git a/luni/src/main/java/java/io/PipedInputStream.java b/luni/src/main/java/java/io/PipedInputStream.java index 83987ec..a6b0336 100644 --- a/luni/src/main/java/java/io/PipedInputStream.java +++ b/luni/src/main/java/java/io/PipedInputStream.java @@ -33,7 +33,22 @@ public class PipedInputStream extends InputStream { private boolean isClosed = false; /** - * The circular buffer through which data is passed. + * The circular buffer through which data is passed. Data is read from the + * range {@code [out, in)} and written to the range {@code [in, out)}. + * Data in the buffer is either sequential: <pre> + * { - - - X X X X X X X - - - - - } + * ^ ^ + * | | + * out in</pre> + * ...or wrapped around the buffer's end: <pre> + * { X X X X - - - - - - - - X X X } + * ^ ^ + * | | + * in out</pre> + * When the buffer is empty, {@code in == -1}. Reading when the buffer is + * empty will block until data is available. When the buffer is full, + * {@code in == out}. Writing when the buffer is full will block until free + * space is available. */ protected byte buffer[]; @@ -158,10 +173,14 @@ public class PipedInputStream extends InputStream { throw new IOException(Msg.getString("K0075")); //$NON-NLS-1$ } - if (lastWriter != null && !lastWriter.isAlive() && (in < 0)) { - // KA030=Write end dead - throw new IOException(Msg.getString("KA030")); //$NON-NLS-1$ - } + // BEGIN android-removed + // eagerly throwing prevents checking isClosed and returning normally + // if (lastWriter != null && !lastWriter.isAlive() && (in < 0)) { + // // KA030=Write end dead + // throw new IOException(Msg.getString("KA030")); //$NON-NLS-1$ + // } + // END android-removed + /** * Set the last thread to be reading on this PipedInputStream. If * lastReader dies while someone is waiting to write an IOException of @@ -187,7 +206,8 @@ public class PipedInputStream extends InputStream { throw new InterruptedIOException(); } - byte result = buffer[out++]; + // BEGIN android-changed + int result = buffer[out++] & 0xff; if (out == buffer.length) { out = 0; } @@ -196,7 +216,12 @@ public class PipedInputStream extends InputStream { in = -1; out = 0; } - return result & 0xff; + + // let blocked writers write to the newly available buffer space + notifyAll(); + + return result; + // END android-changed } /** @@ -261,10 +286,13 @@ public class PipedInputStream extends InputStream { throw new IOException(Msg.getString("K0075")); //$NON-NLS-1$ } - if (lastWriter != null && !lastWriter.isAlive() && (in < 0)) { - // KA030=Write end dead - throw new IOException(Msg.getString("KA030")); //$NON-NLS-1$ - } + // BEGIN android-removed + // eagerly throwing prevents checking isClosed and returning normally + // if (lastWriter != null && !lastWriter.isAlive() && (in < 0)) { + // // KA030=Write end dead + // throw new IOException(Msg.getString("KA030")); //$NON-NLS-1$ + // } + // END android-removed /** * Set the last thread to be reading on this PipedInputStream. If @@ -291,13 +319,15 @@ public class PipedInputStream extends InputStream { throw new InterruptedIOException(); } - int copyLength = 0; - /* Copy bytes from out to end of buffer first */ + // BEGIN android-changed + int totalCopied = 0; + + // copy bytes from out thru the end of buffer if (out >= in) { - copyLength = count > (buffer.length - out) ? buffer.length - out - : count; - System.arraycopy(buffer, out, bytes, offset, copyLength); - out += copyLength; + int leftInBuffer = buffer.length - out; + int length = leftInBuffer < count ? leftInBuffer : count; + System.arraycopy(buffer, out, bytes, offset, length); + out += length; if (out == buffer.length) { out = 0; } @@ -306,28 +336,29 @@ public class PipedInputStream extends InputStream { in = -1; out = 0; } + totalCopied += length; } - /* - * Did the read fully succeed in the previous copy or is the buffer - * empty? - */ - if (copyLength == count || in == -1) { - return copyLength; + // copy bytes from out thru in + if (totalCopied < count && in != -1) { + int leftInBuffer = in - out; + int leftToCopy = count - totalCopied; + int length = leftToCopy < leftInBuffer ? leftToCopy : leftInBuffer; + System.arraycopy(buffer, out, bytes, offset + totalCopied, length); + out += length; + if (out == in) { + // empty buffer + in = -1; + out = 0; + } + totalCopied += length; } - int bytesCopied = copyLength; - /* Copy bytes from 0 to the number of available bytes */ - copyLength = in - out > (count - bytesCopied) ? count - bytesCopied - : in - out; - System.arraycopy(buffer, out, bytes, offset + bytesCopied, copyLength); - out += copyLength; - if (out == in) { - // empty buffer - in = -1; - out = 0; - } - return bytesCopied + copyLength; + // let blocked writers write to the newly available buffer space + notifyAll(); + + return totalCopied; + // END android-changed } /** @@ -351,9 +382,12 @@ public class PipedInputStream extends InputStream { if (buffer == null || isClosed) { throw new IOException(Msg.getString("K0078")); //$NON-NLS-1$ } - if (lastReader != null && !lastReader.isAlive()) { - throw new IOException(Msg.getString("K0076")); //$NON-NLS-1$ - } + // BEGIN android-removed + // eagerly throwing causes us to fail even if the buffer's not full + // if (lastReader != null && !lastReader.isAlive()) { + // throw new IOException(Msg.getString("K0076")); //$NON-NLS-1$ + // } + // END android-removed /** * Set the last thread to be writing on this PipedInputStream. If * lastWriter dies while someone is waiting to read an IOException of @@ -362,11 +396,14 @@ public class PipedInputStream extends InputStream { lastWriter = Thread.currentThread(); try { while (buffer != null && out == in) { - notifyAll(); - wait(1000); + // BEGIN android-changed + // moved has-last-reader-died check to be before wait() if (lastReader != null && !lastReader.isAlive()) { throw new IOException(Msg.getString("K0076")); //$NON-NLS-1$ } + notifyAll(); + wait(1000); + // END android-changed } } catch (InterruptedException e) { throw new InterruptedIOException(); @@ -379,7 +416,11 @@ public class PipedInputStream extends InputStream { if (in == buffer.length) { in = 0; } - return; + + // BEGIN android-added + // let blocked readers read the newly available data + notifyAll(); + // END android-added } } |