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() {


Reply via email to