Author: toad
Date: 2008-09-19 15:59:04 +0000 (Fri, 19 Sep 2008)
New Revision: 22706

Modified:
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Use an array of LinkedList, one per priority, instead of trying to insert 
messages in the middle of one by priority.
Simplifies code, shouldn't cost more than a few kB of memory, and will soon be 
important for maybeSendPacket().


Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-09-19 15:57:54 UTC 
(rev 22705)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-09-19 15:59:04 UTC 
(rev 22706)
@@ -207,7 +207,7 @@
        final PeerManager peers;
        /** MessageItem's to send ASAP. 
         * LOCKING: Lock on self, always take that lock last. Sometimes used 
inside PeerNode.this lock. */
-       private final LinkedList messagesToSendNow;
+       private final LinkedList[] messagesToSendNow;
        /** When did we last receive a SwapRequest? */
        private long timeLastReceivedSwapRequest;
        /** Average interval between SwapRequest's */
@@ -588,7 +588,9 @@
                // Not connected yet; need to handshake
                isConnected = false;

-               messagesToSendNow = new LinkedList();
+               messagesToSendNow = new LinkedList[DMT.NUM_PRIORITIES];
+               for(int i=0;i<messagesToSendNow.length;i++)
+                       messagesToSendNow[i] = new LinkedList();

                decrementHTLAtMaximum = node.random.nextFloat() < 
Node.DECREMENT_AT_MAX_PROB;
                decrementHTLAtMinimum = node.random.nextFloat() < 
Node.DECREMENT_AT_MIN_PROB;
@@ -1035,13 +1037,15 @@
                int x = 0;
                synchronized(messagesToSendNow) {
                        enqueuePrioritizedMessageItem(item);
-                       Iterator i = messagesToSendNow.iterator();
+                       for(int p=0;p<messagesToSendNow.length;p++) {
+                       Iterator i = messagesToSendNow[p].iterator();
                        for(; i.hasNext();) {
                                MessageItem it = (MessageItem) (i.next());
                                x += it.getLength() + 2;
                                if(x > 1024)
                                        break;
                        }
+                       }
                }
                if(x > 1024 || !node.enablePacketCoalescing) {
                        // If there is a packet's worth to send, wake up the 
packetsender.
@@ -1055,11 +1059,13 @@
        public long getMessageQueueLengthBytes() {
                long x = 0;
                synchronized(messagesToSendNow) {
-                       Iterator i = messagesToSendNow.iterator();
+                       for(int p=0;p<messagesToSendNow.length;p++) {
+                       Iterator i = messagesToSendNow[p].iterator();
                        for(; i.hasNext();) {
                                MessageItem it = (MessageItem) (i.next());
                                x += it.getLength() + 2;
                        }
+                       }
                }
                return x;
        }
@@ -1067,15 +1073,8 @@
        private void enqueuePrioritizedMessageItem(MessageItem addMe) {
                synchronized (messagesToSendNow) {
                        //Assume it goes on the end, both the common case
-                       ListIterator 
i=messagesToSendNow.listIterator(messagesToSendNow.size());
-                       while (i.hasPrevious()) {
-                               MessageItem here=(MessageItem)i.previous();
-                               //Add the item *to the end of the queue*.
-                               if(here.getPriority() > addMe.getPriority()) {
-                                       break;
-                               }
-                       }
-                       i.add(addMe);
+                       short prio = addMe.getPriority();
+                       messagesToSendNow[prio].addLast(addMe);
                }
        }

@@ -1085,16 +1084,8 @@
        private void pushfrontPrioritizedMessageItem(MessageItem addMe) {
                synchronized (messagesToSendNow) {
                        //Assume it goes on the front
-                       ListIterator i=messagesToSendNow.listIterator();
-                       while (i.hasNext()) {
-                               MessageItem here=(MessageItem)i.next();
-                               //While the item we are adding is a LOWER 
priority, move on (forwards...)
-                               if (addMe.getPriority() <= here.getPriority()) {
-                                       i.previous();
-                                       break;
-                               }
-                       }
-                       i.add(addMe);
+                       short prio = addMe.getPriority();
+                       messagesToSendNow[prio].addFirst(addMe);
                }
        }       

@@ -1210,15 +1201,12 @@
                                timeLastDisconnect = now;
                        }
                        if(dumpMessageQueue) {
-                               synchronized(messagesToSendNow) {
-                                       messagesTellDisconnected = 
(MessageItem[]) messagesToSendNow.toArray(new 
MessageItem[messagesToSendNow.size()]);
-                                       messagesToSendNow.clear();
-                               }
+                               messagesTellDisconnected = 
grabQueuedMessageItems();
                        }
                }
                if(messagesTellDisconnected != null) {
-                       for(int i=0;i<messagesTellDisconnected.length;i++) {
-                               messagesTellDisconnected[i].onDisconnect();
+                       for(MessageItem mi : messagesTellDisconnected) {
+                               mi.onDisconnect();
                        }
                }
                if(cur != null) cur.disconnected();
@@ -1233,14 +1221,12 @@
                                public void run() {
                                        if((!PeerNode.this.isConnected()) &&
                                                        timeLastDisconnect == 
now) {
-                                               MessageItem[] 
messagesTellDisconnected;
-                                               
synchronized(PeerNode.this.messagesToSendNow) {
-                                                       
messagesTellDisconnected = (MessageItem[]) messagesToSendNow.toArray(new 
MessageItem[messagesToSendNow.size()]);
-                                                       
PeerNode.this.messagesToSendNow.clear();
+                                               MessageItem[] 
messagesTellDisconnected = grabQueuedMessageItems();
+                                               if(messagesTellDisconnected != 
null) {
+                                                       for(MessageItem mi : 
messagesTellDisconnected) {
+                                                               
mi.onDisconnect();
+                                                       }
                                                }
-                                               for(int 
i=0;i<messagesTellDisconnected.length;i++) {
-                                                       
messagesTellDisconnected[i].onDisconnect();
-                                               }
                                        }

                                }
@@ -1270,12 +1256,17 @@
        */
        public MessageItem[] grabQueuedMessageItems() {
                synchronized(messagesToSendNow) {
-                       if(messagesToSendNow.size() == 0)
-                               return null;
-                       MessageItem[] messages = new 
MessageItem[messagesToSendNow.size()];
-                       messages = (MessageItem[]) 
messagesToSendNow.toArray(messages);
-                       messagesToSendNow.clear();
-                       return messages;
+                       int size = 0;
+                       for(int i=0;i<messagesToSendNow.length;i++)
+                               size += messagesToSendNow[i].size();
+                       MessageItem[] output = new MessageItem[size];
+                       int ptr = 0;
+                       for(int i=0;i<messagesToSendNow.length;i++) {
+                               int thisSize = messagesToSendNow[i].size();
+                               System.arraycopy(messagesToSendNow[i], 0, 
output, ptr, thisSize);
+                               ptr += thisSize;
+                       }
+                       return output;
                }
        }

@@ -1909,10 +1900,7 @@
                                // Messages do not persist across restarts.
                                // Generally they would be incomprehensible, 
anything that isn't should be sent as
                                // connection initial messages by 
maybeOnConnect().
-                               synchronized(messagesToSendNow) {
-                                       messagesTellDisconnected = 
(MessageItem[]) messagesToSendNow.toArray(new 
MessageItem[messagesToSendNow.size()]);
-                                       messagesToSendNow.clear();
-                               }
+                               messagesTellDisconnected = 
grabQueuedMessageItems();
                                this.offeredMainJarVersion = 0;
                        } // else it's a rekey
                        if(unverified) {


Reply via email to