Author: toad
Date: 2007-02-16 04:01:09 +0000 (Fri, 16 Feb 2007)
New Revision: 11808
Modified:
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerManager.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/TestnetHandler.java
trunk/freenet/src/freenet/support/SimpleFieldSet.java
Log:
Buffer some SimpleFieldSet writes.
Avoid some allocations in SFS.writeTo, at the cost of more write()'s - caller
MUST buffer at the character level.
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2007-02-16 03:00:13 UTC (rev
11807)
+++ trunk/freenet/src/freenet/node/Node.java 2007-02-16 04:01:09 UTC (rev
11808)
@@ -8,6 +8,7 @@
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -692,12 +693,13 @@
if(orig.exists()) backup.delete();
- OutputStreamWriter osr = null;
+ FileOutputStream fos = null;
try {
- FileOutputStream fos = new FileOutputStream(backup);
- osr = new OutputStreamWriter(fos);
- fs.writeTo(osr);
- osr.close();
+ fos = new FileOutputStream(backup);
+ OutputStreamWriter osr = new OutputStreamWriter(fos);
+ BufferedWriter bw = new BufferedWriter(osr);
+ fs.writeTo(bw);
+ bw.close();
if(!backup.renameTo(orig)) {
orig.delete();
if(!backup.renameTo(orig)) {
@@ -705,9 +707,9 @@
}
}
} catch (IOException e) {
- if(osr != null) {
+ if(fos != null) {
try {
- osr.close();
+ fos.close();
} catch (IOException e1) {
Logger.error(this, "Cannot close
"+backup+": "+e1, e1);
}
@@ -2676,14 +2678,14 @@
DeflaterOutputStream gis;
gis = new DeflaterOutputStream(baos);
OutputStreamWriter osw = new OutputStreamWriter(gis);
+ BufferedWriter bw = new BufferedWriter(osw);
try {
- fs.writeTo(osw);
+ fs.writeTo(bw);
} catch (IOException e) {
throw new Error(e);
}
try {
- osw.flush();
- gis.close();
+ bw.close();
} catch (IOException e1) {
throw new Error(e1);
}
@@ -3449,8 +3451,9 @@
// FIXME common pattern, reuse it.
BufferedOutputStream bos = new
BufferedOutputStream(fos);
OutputStreamWriter osw = new OutputStreamWriter(bos,
"UTF-8");
+ BufferedWriter bw = new BufferedWriter(osw);
try {
- fs.writeTo(osw);
+ fs.writeTo(bw);
} catch (IOException e) {
try {
fos.close();
@@ -3461,7 +3464,7 @@
}
}
try {
- osw.close();
+ bw.close();
} catch (IOException e) {
// Huh?
Logger.error(this, "Caught while closing: "+e,
e);
Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java 2007-02-16 03:00:13 UTC
(rev 11807)
+++ trunk/freenet/src/freenet/node/PeerManager.java 2007-02-16 04:01:09 UTC
(rev 11808)
@@ -4,6 +4,7 @@
package freenet.node;
import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
@@ -12,6 +13,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
+import java.io.Writer;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Vector;
@@ -623,13 +625,14 @@
return;
}
OutputStreamWriter w = new OutputStreamWriter(fos);
+ BufferedWriter bw = new BufferedWriter(w);
try {
- boolean succeeded = writePeers(w);
- w.close();
+ boolean succeeded = writePeers(bw);
+ bw.close();
if(!succeeded) return;
} catch (IOException e) {
try {
- w.close();
+ fos.close();
} catch (IOException e1) {
Logger.error(this, "Cannot close peers file: "+e, e);
}
@@ -646,18 +649,18 @@
}
}
- public boolean writePeers(OutputStreamWriter w) {
+ public boolean writePeers(Writer bw) {
PeerNode[] peers;
synchronized (this) {
peers = myPeers;
}
for (int i = 0; i < peers.length; i++) {
try {
- peers[i].write(w);
- w.flush();
+ peers[i].write(bw);
+ bw.flush();
} catch (IOException e) {
try {
- w.close();
+ bw.close();
} catch (IOException e1) {
Logger.error(this, "Cannot close file!: " + e1, e1);
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2007-02-16 03:00:13 UTC
(rev 11807)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2007-02-16 04:01:09 UTC
(rev 11808)
@@ -1,6 +1,7 @@
package freenet.node;
import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.File;
@@ -2791,12 +2792,13 @@
return -1;
}
OutputStreamWriter w = new OutputStreamWriter(fos);
+ BufferedWriter bw = new BufferedWriter(w);
try {
- fs.writeTo(w);
- w.close();
+ fs.writeTo(bw);
+ bw.close();
} catch (IOException e) {
try {
- w.close();
+ fos.close();
} catch (IOException e1) {
Logger.error(this, "Cannot close extra peer
data file: "+e, e);
}
@@ -2883,12 +2885,13 @@
return false;
}
OutputStreamWriter w = new OutputStreamWriter(fos);
+ BufferedWriter bw = new BufferedWriter(w);
try {
- fs.writeTo(w);
- w.close();
+ fs.writeTo(bw);
+ bw.close();
} catch (IOException e) {
try {
- w.close();
+ fos.close();
} catch (IOException e1) {
Logger.error(this, "Cannot close extra peer
data file: "+e, e);
}
Modified: trunk/freenet/src/freenet/node/TestnetHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/TestnetHandler.java 2007-02-16 03:00:13 UTC
(rev 11807)
+++ trunk/freenet/src/freenet/node/TestnetHandler.java 2007-02-16 04:01:09 UTC
(rev 11808)
@@ -4,6 +4,7 @@
package freenet.node;
import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -175,12 +176,13 @@
} else if(command.equalsIgnoreCase("PEERS")) {
if(logMINOR) Logger.minor(this,
"Sending references");
OutputStreamWriter osw = new
OutputStreamWriter(os, "ISO-8859-1");
- osw.write("My ref:\n\n");
+ BufferedWriter bw = new
BufferedWriter(osw);
+ bw.write("My ref:\n\n");
SimpleFieldSet fs =
node.exportPublicFieldSet();
- fs.writeTo(osw);
- osw.write("\n\nMy peers:\n");
- node.peers.writePeers(osw);
- osw.close();
+ fs.writeTo(bw);
+ bw.write("\n\nMy peers:\n");
+ node.peers.writePeers(bw);
+ bw.close();
}else {
Logger.error(this, "Unknown testnet
command: "+command);
}
Modified: trunk/freenet/src/freenet/support/SimpleFieldSet.java
===================================================================
--- trunk/freenet/src/freenet/support/SimpleFieldSet.java 2007-02-16
03:00:13 UTC (rev 11807)
+++ trunk/freenet/src/freenet/support/SimpleFieldSet.java 2007-02-16
04:01:09 UTC (rev 11808)
@@ -303,18 +303,28 @@
/**
* Write the contents of the SimpleFieldSet to a Writer.
- * @param osr
+ * Note: The caller *must* buffer the writer to avoid lousy performance!
+ * (StringWriter is by definition buffered, otherwise wrap it in a
BufferedWriter)
*/
public void writeTo(Writer w) throws IOException {
writeTo(w, "", false);
}
+ /**
+ * Write the contents of the SimpleFieldSet to a Writer.
+ * Note: The caller *must* buffer the writer to avoid lousy performance!
+ * (StringWriter is by definition buffered, otherwise wrap it in a
BufferedWriter)
+ */
synchronized void writeTo(Writer w, String prefix, boolean noEndMarker)
throws IOException {
for(Iterator i = values.entrySet().iterator();i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
- w.write(prefix+key+ '=' +value+ '\n');
+ w.write(prefix);
+ w.write(key);
+ w.write('=');
+ w.write(value);
+ w.write('\n');
}
if(subsets != null) {
for(Iterator i = subsets.entrySet().iterator();i.hasNext();) {
@@ -328,8 +338,10 @@
if(!noEndMarker) {
if(endMarker == null)
w.write("End\n");
- else
- w.write(endMarker+ '\n');
+ else {
+ w.write(endMarker);
+ w.write('\n');
+ }
}
}