Author: toad
Date: 2007-02-07 14:54:33 +0000 (Wed, 07 Feb 2007)
New Revision: 11683
Modified:
trunk/freenet/src/freenet/node/KeyTracker.java
trunk/freenet/src/freenet/node/PacketSender.java
trunk/freenet/src/freenet/node/PeerNode.java
Log:
Save some more allocations
Modified: trunk/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- trunk/freenet/src/freenet/node/KeyTracker.java 2007-02-07 14:33:43 UTC
(rev 11682)
+++ trunk/freenet/src/freenet/node/KeyTracker.java 2007-02-07 14:54:33 UTC
(rev 11683)
@@ -6,6 +6,7 @@
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.Vector;
import freenet.crypt.BlockCipher;
import freenet.io.comm.NotConnectedException;
@@ -1031,17 +1032,24 @@
}
/**
- * @return An array of packets that need to be resent, if any.
- * Some of the elements may be null. Otherwise null.
+ * Fill rpiTemp with ResendPacketItems of packets that need to be
+ * resent.
+ * @return An array of integers which contains the packet numbers
+ * to be resent (the RPI's are put into rpiTemp), or null if there
+ * are no packets to resend.
+ *
+ * Not a very nice API, but it saves a load of allocations, and at
+ * least it's documented!
*/
- public ResendPacketItem[] grabResendPackets() {
- int[] numbers;
+ public int[] grabResendPackets(Vector rpiTemp, int[] numbers) {
+ rpiTemp.clear();
long now = System.currentTimeMillis();
long fourRTTs = fourRTTs();
int count=0;
synchronized(packetsToResend) {
int len = packetsToResend.size();
- numbers = new int[len];
+ if(numbers.length < len)
+ numbers = new int[len * 2];
for(Iterator it=packetsToResend.iterator();it.hasNext();) {
int packetNo = ((Integer)it.next()).intValue();
long resentTime = sentPacketsContents.getReaddedTime(packetNo);
@@ -1053,7 +1061,6 @@
}
packetsToResend.clear();
}
- ResendPacketItem[] items = new ResendPacketItem[count];
for(int i=0;i<count;i++) {
int packetNo = numbers[i];
byte[] buf = sentPacketsContents.get(packetNo);
@@ -1062,9 +1069,10 @@
continue; // acked already?
}
AsyncMessageCallback[] callbacks =
sentPacketsContents.getCallbacks(packetNo);
- items[i] = new ResendPacketItem(buf, packetNo, this, callbacks);
+ rpiTemp.add(new ResendPacketItem(buf, packetNo, this, callbacks));
}
- return items;
+ if(rpiTemp.isEmpty()) return null;
+ return numbers;
}
public boolean isDeprecated() {
Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java 2007-02-07 14:33:43 UTC
(rev 11682)
+++ trunk/freenet/src/freenet/node/PacketSender.java 2007-02-07 14:54:33 UTC
(rev 11683)
@@ -41,6 +41,9 @@
/** For watchdog. 32-bit to avoid locking. */
volatile int lastTimeInSeconds;
+ private Vector rpiTemp;
+ private int[] rpiIntTemp;
+
PacketSender(Node node) {
resendPackets = new LinkedList();
timedJobsByTime = new TreeMap();
@@ -49,6 +52,8 @@
myThread.setDaemon(true);
myThread.setPriority(Thread.MAX_PRIORITY);
logMINOR = Logger.shouldLog(Logger.MINOR, this);
+ rpiTemp = new Vector();
+ rpiIntTemp = new int[64];
}
@@ -213,21 +218,22 @@
else if(j == 1) kt = pn.getPreviousKeyTracker();
else break; // impossible
if(kt == null) continue;
- ResendPacketItem[] resendItems = kt.grabResendPackets();
- if(resendItems == null) continue;
- for(int k=0;k<resendItems.length;k++) {
- ResendPacketItem item = resendItems[k];
+ int[] tmp = kt.grabResendPackets(rpiTemp, rpiIntTemp);
+ if(tmp == null) continue;
+ rpiIntTemp = tmp;
+ for(int k=0;k<rpiTemp.size();k++) {
+ ResendPacketItem item = (ResendPacketItem)
rpiTemp.get(k);
if(item == null) continue;
try {
if(logMINOR) Logger.minor(this, "Resending
"+item.packetNumber+" to "+item.kt);
node.packetMangler.resend(item);
} catch (KeyChangedException e) {
Logger.error(this, "Caught "+e+" resending packets
to "+kt);
- pn.requeueResendItems(resendItems);
+ pn.requeueResendItems(rpiTemp);
break;
} catch (NotConnectedException e) {
Logger.normal(this, "Caught "+e+" resending
packets to "+kt);
- pn.requeueResendItems(resendItems);
+ pn.requeueResendItems(rpiTemp);
break;
} catch (PacketSequenceException e) {
Logger.error(this, "Caught "+e+" -
disconnecting", e);
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2007-02-07 14:33:43 UTC
(rev 11682)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2007-02-07 14:54:33 UTC
(rev 11683)
@@ -1970,15 +1970,15 @@
* Requeue ResendPacketItem[]s if they are not sent.
* @param resendItems
*/
- public void requeueResendItems(ResendPacketItem[] resendItems) {
+ public void requeueResendItems(Vector resendItems) {
KeyTracker cur, prev, unv;
synchronized(this) {
cur = currentTracker;
prev = previousTracker;
unv = unverifiedTracker;
}
- for(int i=0;i<resendItems.length;i++) {
- ResendPacketItem item = resendItems[i];
+ for(int i=0;i<resendItems.size();i++) {
+ ResendPacketItem item = (ResendPacketItem) resendItems.get(i);
if(item.pn != this)
throw new IllegalArgumentException("item.pn != this!");
KeyTracker kt = cur;