Author: toad
Date: 2008-09-19 14:38:30 +0000 (Fri, 19 Sep 2008)
New Revision: 22702

Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/MessageItem.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
We always resolve the MessageItem very soon after creation anyway, so it 
doesn't save any memory to do it lazily.
It's simpler to resolve it on creation.


Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-09-19 
14:32:12 UTC (rev 22701)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-09-19 
14:38:30 UTC (rev 22702)
@@ -2022,11 +2022,11 @@
                for(int i=0;i<messageData.length;i++) {
                        MessageItem mi = messages[i];
                        if(logMINOR) Logger.minor(this, "Handling 
"+(mi.formatted ? "formatted " : "") + 
-                                       "MessageItem "+mi+" : 
"+mi.getData(pn).length);
+                                       "MessageItem "+mi+" : "+mi.getLength());
                        mi_name = (mi.msg == null ? "(not a Message)" : 
mi.msg.getSpec().getName());
                        if(mi.formatted) {
                                try {
-                                       byte[] buf = mi.getData(pn);
+                                       byte[] buf = mi.getData();
                                        int packetNumber = 
kt.allocateOutgoingPacketNumberNeverBlock();
                                        int size = 
processOutgoingPreformatted(buf, 0, buf.length, kt, packetNumber, mi.cb, 
mi.alreadyReportedBytes, mi.getPriority());
                                        //MARK: onSent()
@@ -2065,7 +2065,7 @@
                                        return;
                                }
                        } else {
-                               byte[] data = mi.getData(pn);
+                               byte[] data = mi.getData();
                                messageData[x] = data;
                                if(data.length > sock.getMaxPacketSize()) {
                                        Logger.error(this, "Message exceeds 
packet size: "+messages[i]+" size "+data.length+" message "+mi.msg);

Modified: trunk/freenet/src/freenet/node/MessageItem.java
===================================================================
--- trunk/freenet/src/freenet/node/MessageItem.java     2008-09-19 14:32:12 UTC 
(rev 22701)
+++ trunk/freenet/src/freenet/node/MessageItem.java     2008-09-19 14:38:30 UTC 
(rev 22702)
@@ -8,11 +8,13 @@
 import freenet.io.comm.Message;
 import freenet.support.Logger;

-/** A queued Message or byte[], and a callback, which may be null. */
+/** A queued byte[], maybe including a Message, and a callback, which may be 
null.
+ * Note that we always create the byte[] on construction, as almost everywhere 
+ * which uses a MessageItem needs to know its length immediately. */
 public class MessageItem {

     final Message msg;
-    byte[] buf;
+    final byte[] buf;
     final AsyncMessageCallback[] cb;
     final long submitted;
     final int alreadyReportedBytes;
@@ -23,15 +25,18 @@
     final ByteCounter ctrCallback;
     private final short priority;

-    public MessageItem(Message msg2, AsyncMessageCallback[] cb2, int 
alreadyReportedBytes, ByteCounter ctr) {
+    public MessageItem(Message msg2, AsyncMessageCallback[] cb2, int 
alreadyReportedBytes, ByteCounter ctr, PeerNode pn) {
        this.alreadyReportedBytes = alreadyReportedBytes;
         this.msg = msg2;
         this.cb = cb2;
-        buf = null;
         formatted = false;
         this.ctrCallback = ctr;
         this.submitted = System.currentTimeMillis();
         priority = msg2.getSpec().getPriority();
+        buf = msg.encodeToPacket(pn);
+        if(buf.length <= alreadyReportedBytes) {
+               Logger.error(this, "buf.length = "+buf.length+" but 
alreadyReportedBytes = "+alreadyReportedBytes+" on "+this);
+        }
     }

     public MessageItem(byte[] data, AsyncMessageCallback[] cb2, boolean 
formatted, int alreadyReportedBytes, ByteCounter ctr, short priority) {
@@ -50,14 +55,13 @@
     /**
      * Return the data contents of this MessageItem.
      */
-    public byte[] getData(PeerNode pn) {
-        if(buf == null)
-            buf = msg.encodeToPacket(pn);
-        if(buf.length <= alreadyReportedBytes) {
-               Logger.error(this, "buf.length = "+buf.length+" but 
alreadyReportedBytes = "+alreadyReportedBytes+" on "+this);
-        }
+    public byte[] getData() {
         return buf;
     }
+    
+    public int getLength() {
+       return buf.length;
+    }

     /**
      * @param length The actual number of bytes sent to send this message, 
including our share of the packet overheads,

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-09-19 14:32:12 UTC 
(rev 22701)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-09-19 14:38:30 UTC 
(rev 22702)
@@ -1029,8 +1029,7 @@
                if(!isConnected())
                        throw new NotConnectedException();
                addToLocalNodeSentMessagesToStatistic(msg);
-               MessageItem item = new MessageItem(msg, cb == null ? null : new 
AsyncMessageCallback[]{cb}, alreadyReportedBytes, ctr);
-               item.getData(this);
+               MessageItem item = new MessageItem(msg, cb == null ? null : new 
AsyncMessageCallback[]{cb}, alreadyReportedBytes, ctr, this);
                long now = System.currentTimeMillis();
                reportBackoffStatus(now);
                int x = 0;
@@ -1039,7 +1038,7 @@
                        Iterator i = messagesToSendNow.iterator();
                        for(; i.hasNext();) {
                                MessageItem it = (MessageItem) (i.next());
-                               x += it.getData(this).length + 2;
+                               x += it.getLength() + 2;
                                if(x > 1024)
                                        break;
                        }
@@ -1059,7 +1058,7 @@
                        Iterator i = messagesToSendNow.iterator();
                        for(; i.hasNext();) {
                                MessageItem it = (MessageItem) (i.next());
-                               x += it.getData(this).length + 2;
+                               x += it.getLength() + 2;
                        }
                }
                return x;
@@ -4164,7 +4163,7 @@
                        for(int j = 0; j < messages.length; j++) {
                                if(l > messages[j].submitted)
                                        l = messages[j].submitted;
-                               sz += 2 + /* FIXME only 2? */ 
messages[j].getData(this).length;
+                               sz += 2 + /* FIXME only 2? */ 
messages[j].getLength();
                        }
                        if(node.enablePacketCoalescing && (l + 
PacketSender.MAX_COALESCING_DELAY > now) &&
                                (sz < ((PacketSocketHandler) 
getSocketHandler()).getPacketSendThreshold())) {
@@ -4197,7 +4196,7 @@
                        // Force packet to have a sequence number.
                        Message m = DMT.createFNPVoid();
                        addToLocalNodeSentMessagesToStatistic(m);
-                       getOutgoingMangler().processOutgoingOrRequeue(new 
MessageItem[]{new MessageItem(m, null, 0, null)}, this, true, true);
+                       getOutgoingMangler().processOutgoingOrRequeue(new 
MessageItem[]{new MessageItem(m, null, 0, null, this)}, this, true, true);
                }
        }
 }


Reply via email to