Author: toad
Date: 2006-12-19 13:57:34 +0000 (Tue, 19 Dec 2006)
New Revision: 11481
Added:
trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
Modified:
trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java
trunk/freenet/src/freenet/support/io/PersistentFileTracker.java
trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java
Log:
Fix serialization again.
Added: trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
(rev 0)
+++ trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java 2006-12-19
13:57:34 UTC (rev 11481)
@@ -0,0 +1,81 @@
+/**
+ * This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL.
+ */
+package freenet.support.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import freenet.crypt.RandomSource;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
+import freenet.support.api.Bucket;
+
+public class DelayedFreeBucket implements Bucket, SerializableToFieldSetBucket
{
+
+ private final PersistentFileTracker factory;
+ Bucket bucket;
+ boolean freed;
+
+ public DelayedFreeBucket(PersistentTempBucketFactory factory,
PaddedEphemerallyEncryptedBucket bucket) {
+ this.factory = factory;
+ this.bucket = bucket;
+ }
+
+ public DelayedFreeBucket(SimpleFieldSet fs, RandomSource random,
PersistentFileTracker f) throws CannotCreateFromFieldSetException {
+ factory = f;
+ freed = false;
+ bucket = SerializableToFieldSetBucketUtil.create(fs, random, f);
+ }
+
+ public OutputStream getOutputStream() throws IOException {
+ if(freed) throw new IOException("Already freed");
+ return bucket.getOutputStream();
+ }
+
+ public InputStream getInputStream() throws IOException {
+ if(freed) throw new IOException("Already freed");
+ return bucket.getInputStream();
+ }
+
+ public String getName() {
+ return bucket.getName();
+ }
+
+ public long size() {
+ return bucket.size();
+ }
+
+ public boolean isReadOnly() {
+ return bucket.isReadOnly();
+ }
+
+ public void setReadOnly() {
+ bucket.setReadOnly();
+ }
+
+ public void free() {
+ synchronized(this) { // mutex on just this method; make a
separate lock if necessary to lock the above
+ if(freed) return;
+ this.factory.delayedFreeBucket(bucket);
+ freed = true;
+ }
+ }
+
+ public SimpleFieldSet toFieldSet() {
+ if(freed) return null;
+ SimpleFieldSet fs = new SimpleFieldSet();
+ fs.put("Type", "DelayedFreeBucket");
+ if(bucket instanceof SerializableToFieldSetBucket) {
+ fs.put("Underlying",
((SerializableToFieldSetBucket)bucket).toFieldSet());
+ } else {
+ Logger.error(this, "Cannot serialize underlying bucket:
"+bucket);
+ return null;
+ }
+ return fs;
+ }
+
+}
\ No newline at end of file
Modified: trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java
===================================================================
--- trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java
2006-12-19 13:57:34 UTC (rev 11481)
@@ -5,10 +5,17 @@
import java.io.File;
+import freenet.support.api.Bucket;
+
public class NullPersistentFileTracker implements PersistentFileTracker {
public void register(File file) {
// Do nothing
}
+ public void delayedFreeBucket(Bucket bucket) {
+ // Free immediately
+ bucket.free();
+ }
+
}
Modified: trunk/freenet/src/freenet/support/io/PersistentFileTracker.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PersistentFileTracker.java
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/PersistentFileTracker.java
2006-12-19 13:57:34 UTC (rev 11481)
@@ -5,8 +5,16 @@
import java.io.File;
+import freenet.support.api.Bucket;
+
public interface PersistentFileTracker {
public void register(File file);
+
+ /** Notify that we have finished with a bucket and it should be freed
after the
+ * next serialization to disk.
+ * @param bucket The bucket to free. Should be a DelayedFreeBucket.
+ */
+ public void delayedFreeBucket(Bucket bucket);
}
Modified: trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
2006-12-19 13:57:34 UTC (rev 11481)
@@ -5,8 +5,6 @@
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
@@ -113,12 +111,12 @@
public Bucket makeBucket(long size) throws IOException {
Bucket b = makeRawBucket(size);
- return new DelayedFreeBucket(new
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
+ return new DelayedFreeBucket(this, new
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
}
public Bucket makeEncryptedBucket() throws IOException {
Bucket b = makeRawBucket(-1);
- return new DelayedFreeBucket(new
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
+ return new DelayedFreeBucket(this, new
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
}
/**
@@ -131,7 +129,7 @@
*/
public Bucket registerEncryptedBucket(String filename, byte[] key, long
len) throws IOException {
Bucket fileBucket = register(filename, len > 0);
- return new DelayedFreeBucket(new
PaddedEphemerallyEncryptedBucket(fileBucket, 1024, len, key, rand));
+ return new DelayedFreeBucket(this, new
PaddedEphemerallyEncryptedBucket(fileBucket, 1024, len, key, rand));
}
/**
@@ -154,50 +152,5 @@
public File getDir() {
return dir;
}
-
- public class DelayedFreeBucket implements Bucket {
- Bucket bucket;
- boolean freed;
-
- public DelayedFreeBucket(PaddedEphemerallyEncryptedBucket
bucket) {
- this.bucket = bucket;
- }
-
- public OutputStream getOutputStream() throws IOException {
- if(freed) throw new IOException("Already freed");
- return bucket.getOutputStream();
- }
-
- public InputStream getInputStream() throws IOException {
- if(freed) throw new IOException("Already freed");
- return bucket.getInputStream();
- }
-
- public String getName() {
- return bucket.getName();
- }
-
- public long size() {
- return bucket.size();
- }
-
- public boolean isReadOnly() {
- return bucket.isReadOnly();
- }
-
- public void setReadOnly() {
- bucket.setReadOnly();
- }
-
- public void free() {
- synchronized(this) { // mutex on just this method; make
a separate lock if necessary to lock the above
- if(freed) return;
- delayedFreeBucket(bucket);
- freed = true;
- }
- }
-
- }
-
}
Modified:
trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java
===================================================================
--- trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java
2006-12-19 13:57:34 UTC (rev 11481)
@@ -26,6 +26,8 @@
return new RandomAccessFileBucket(fs, f);
} else if(type.equals("ReadOnlyFileSliceBucket")) {
return new ReadOnlyFileSliceBucket(fs);
+ } else if(type.equals("DelayedFreeBucket")) {
+ return new DelayedFreeBucket(fs, random, f);
} else
throw new
CannotCreateFromFieldSetException("Unrecognized type "+type);
}