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;


Reply via email to