Author: toad
Date: 2007-06-20 21:17:18 +0000 (Wed, 20 Jun 2007)
New Revision: 13668

Modified:
   trunk/freenet/src/freenet/support/io/MultiReaderBucket.java
Log:
Close streams when freeing a ReaderBucket

Modified: trunk/freenet/src/freenet/support/io/MultiReaderBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/MultiReaderBucket.java 2007-06-20 
21:01:28 UTC (rev 13667)
+++ trunk/freenet/src/freenet/support/io/MultiReaderBucket.java 2007-06-20 
21:17:18 UTC (rev 13668)
@@ -3,6 +3,7 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.support.io;

+import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -40,9 +41,28 @@
        }

        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;
@@ -53,9 +73,22 @@
                }

                public InputStream getInputStream() throws IOException {
-                       return bucket.getInputStream();
+                       InputStream is = bucket.getInputStream();
+                       synchronized(MultiReaderBucket.this) {
+                               if(!(freed || closed)) {
+                                       if(readerStreams == null) readerStreams 
= new ArrayList();
+                                       readerStreams.add(is);
+                                       return is;
+                               }
+                       }
+                       try {
+                               is.close();
+                       } catch (IOException e) {
+                               // Ignore
+                       }
+                       throw new IOException("Already freed");
                }
-
+               
                public String getName() {
                        return bucket.getName();
                }


Reply via email to