Author: toad
Date: 2007-06-20 21:22:16 +0000 (Wed, 20 Jun 2007)
New Revision: 13669
Modified:
trunk/freenet/src/freenet/support/io/MultiReaderBucket.java
Log:
Check on read instead
Modified: trunk/freenet/src/freenet/support/io/MultiReaderBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/MultiReaderBucket.java 2007-06-20
21:17:18 UTC (rev 13668)
+++ trunk/freenet/src/freenet/support/io/MultiReaderBucket.java 2007-06-20
21:22:16 UTC (rev 13669)
@@ -43,26 +43,11 @@
class ReaderBucket implements Bucket {
private boolean freed;
- private ArrayList readerStreams;
public void free() {
- InputStream[] streams = null;
synchronized(MultiReaderBucket.this) {
if(freed) return;
freed = true;
- if(readerStreams != null)
- streams = (InputStream[])
readerStreams.toArray(new InputStream[readerStreams.size()]);
- }
- if(streams != null) {
- for(int i=0;i<streams.length;i++) {
- try {
- streams[i].close();
- } catch (IOException e) {
- // Ignore
- }
- }
- }
- synchronized(MultiReaderBucket.this) {
readers.remove(this);
if(!readers.isEmpty()) return;
readers = null;
@@ -73,20 +58,43 @@
}
public InputStream getInputStream() throws IOException {
- InputStream is = bucket.getInputStream();
synchronized(MultiReaderBucket.this) {
- if(!(freed || closed)) {
- if(readerStreams == null) readerStreams
= new ArrayList();
- readerStreams.add(is);
- return is;
+ if(freed || closed) {
+ throw new IOException("Already freed");
}
}
- try {
- is.close();
- } catch (IOException e) {
- // Ignore
+ return new ReaderBucketInputStream();
+ }
+
+ private class ReaderBucketInputStream extends InputStream {
+
+ InputStream is;
+
+ ReaderBucketInputStream() throws IOException {
+ is = bucket.getInputStream();
}
- throw new IOException("Already freed");
+
+ public final int read() throws IOException {
+ synchronized(MultiReaderBucket.this) {
+ if(freed || closed) throw new
IOException("Already closed");
+ }
+ return is.read();
+ }
+
+ public final int read(byte[] data, int offset, int
length) throws IOException {
+ synchronized(MultiReaderBucket.this) {
+ if(freed || closed) throw new
IOException("Already closed");
+ }
+ return is.read(data, offset, length);
+ }
+
+ public final int read(byte[] data) throws IOException {
+ synchronized(MultiReaderBucket.this) {
+ if(freed || closed) throw new
IOException("Already closed");
+ }
+ return is.read(data);
+ }
+
}
public String getName() {