Author: toad
Date: 2008-09-23 23:46:32 +0000 (Tue, 23 Sep 2008)
New Revision: 22788

Modified:
   trunk/freenet/src/freenet/node/PeerMessageQueue.java
Log:
More fixes, should work now.


Modified: trunk/freenet/src/freenet/node/PeerMessageQueue.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerMessageQueue.java        2008-09-23 
23:23:00 UTC (rev 22787)
+++ trunk/freenet/src/freenet/node/PeerMessageQueue.java        2008-09-23 
23:46:32 UTC (rev 22788)
@@ -46,6 +46,7 @@
                        if(itemsByID == null) {
                                itemsByID = new HashMap<Long, 
LinkedList<MessageItem>>();
                                itemsWithID = new 
ArrayList<LinkedList<MessageItem>>();
+                               itemsIDs = new ArrayList<Long>();
                                list = new LinkedList<MessageItem>();
                                itemsWithID.add(list);
                                itemsIDs.add(id);
@@ -79,6 +80,7 @@
                        if(itemsByID == null) {
                                itemsByID = new HashMap<Long, 
LinkedList<MessageItem>>();
                                itemsWithID = new 
ArrayList<LinkedList<MessageItem>>();
+                               itemsIDs = new ArrayList<Long>();
                                list = new LinkedList<MessageItem>();
                                itemsWithID.add(list);
                                itemsIDs.add(id);
@@ -181,7 +183,7 @@
                                }

                                while(true) {
-                                       if(list.isEmpty()) continue;
+                                       if(list.isEmpty()) break;
                                        MessageItem item = list.getFirst();
                                        if(item.submitted + 
PacketSender.MAX_COALESCING_DELAY <= now) {
                                                int thisSize = item.getLength();
@@ -191,12 +193,16 @@
                                                                size += 2 + 
thisSize;
                                                                
list.removeFirst();
                                                                
if(list.isEmpty()) {
-                                                                       if(list 
== itemsNoID) itemsNoID = null;
+                                                                       if(list 
== itemsNoID) {
+                                                                               
itemsNoID = null;
+                                                                               
lists--;
+                                                                       }
                                                                        else {
                                                                                
Long id = itemsIDs.get(listNum);
                                                                                
itemsWithID.remove(listNum);
                                                                                
itemsIDs.remove(listNum);
                                                                                
itemsByID.remove(id);
+                                                                               
lists--;
                                                                        }
                                                                }
                                                                
messages.add(item);
@@ -208,12 +214,15 @@
                                                size += 2 + thisSize;
                                                list.removeFirst();
                                                if(list.isEmpty()) {
-                                                       if(list == itemsNoID) 
itemsNoID = null;
-                                                       else {
+                                                       if(list == itemsNoID) {
+                                                               itemsNoID = 
null;
+                                                               lists--;
+                                                       } else {
                                                                Long id = 
itemsIDs.get(listNum);
                                                                
itemsWithID.remove(listNum);
                                                                
itemsIDs.remove(listNum);
                                                                
itemsByID.remove(id);
+                                                               lists--;
                                                        }
                                                }
                                                messages.add(item);
@@ -257,7 +266,7 @@
                                }

                                while(true) {
-                                       if(list.isEmpty()) continue;
+                                       if(list.isEmpty()) break;
                                        MessageItem item = list.getFirst();
                                        int thisSize = item.getLength();
                                        if(size + 2 + thisSize > maxSize) {
@@ -266,12 +275,15 @@
                                                        size += 2 + thisSize;
                                                        list.removeFirst();
                                                        if(list.isEmpty()) {
-                                                               if(list == 
itemsNoID) itemsNoID = null;
-                                                               else {
+                                                               if(list == 
itemsNoID) {
+                                                                       
itemsNoID = null;
+                                                                       lists--;
+                                                               } else {
                                                                        Long id 
= itemsIDs.get(listNum);
                                                                        
itemsWithID.remove(listNum);
                                                                        
itemsIDs.remove(listNum);
                                                                        
itemsByID.remove(id);
+                                                                       lists--;
                                                                }
                                                        }
                                                        messages.add(item);
@@ -283,12 +295,15 @@
                                        size += 2 + thisSize;
                                        list.removeFirst();
                                        if(list.isEmpty()) {
-                                               if(list == itemsNoID) itemsNoID 
= null;
-                                               else {
+                                               if(list == itemsNoID) {
+                                                       itemsNoID = null;
+                                                       lists--;
+                                               } else {
                                                        Long id = 
itemsIDs.get(listNum);
                                                        
itemsWithID.remove(listNum);
                                                        
itemsIDs.remove(listNum);
                                                        itemsByID.remove(id);
+                                                       lists--;
                                                }
                                        }
                                        messages.add(item);
@@ -399,7 +414,7 @@
                return getNextUrgentTime(Long.MAX_VALUE, now) <= now;
        }

-       public boolean mustSendSize(int minSize, int maxSize) {
+       public synchronized boolean mustSendSize(int minSize, int maxSize) {
                int length = minSize;
                for(PrioQueue items : queuesByPriority) {
                        length = items.addSize(length, maxSize);
@@ -420,13 +435,11 @@
         */
        public synchronized int addUrgentMessages(int size, long now, int 
minSize, int maxSize, ArrayList<MessageItem> messages) {
                boolean gotEnough = false;
-               while(!gotEnough) {
-                       for(PrioQueue queue : queuesByPriority) {
-                               size = queue.addUrgentMessages(size, minSize, 
maxSize, now, messages);
-                               if(size < 0) {
-                                       size = -size;
-                                       gotEnough = true;
-                               }
+               for(PrioQueue queue : queuesByPriority) {
+                       size = queue.addUrgentMessages(size, minSize, maxSize, 
now, messages);
+                       if(size < 0) {
+                               size = -size;
+                               gotEnough = true;
                        }
                }
                if(gotEnough)
@@ -445,15 +458,13 @@
         * @return The new size of the packet, multiplied by -1 iff there are 
more
         * messages but they don't fit.
         */
-       public int addNonUrgentMessages(int size, long now, int minSize, int 
maxSize, ArrayList<MessageItem> messages) {
+       public synchronized int addNonUrgentMessages(int size, long now, int 
minSize, int maxSize, ArrayList<MessageItem> messages) {
                boolean gotEnough = false;
-               while(!gotEnough) {
-                       for(PrioQueue queue : queuesByPriority) {
-                               size = queue.addMessages(size, minSize, 
maxSize, now, messages);
-                               if(size < 0) {
-                                       size = -size;
-                                       gotEnough = true;
-                               }
+               for(PrioQueue queue : queuesByPriority) {
+                       size = queue.addMessages(size, minSize, maxSize, now, 
messages);
+                       if(size < 0) {
+                               size = -size;
+                               gotEnough = true;
                        }
                }
                if(gotEnough)


Reply via email to