Author: toad
Date: 2008-09-23 23:22:20 +0000 (Tue, 23 Sep 2008)
New Revision: 22786

Modified:
   trunk/freenet/src/freenet/node/PeerMessageQueue.java
Log:
Prevent memory leak


Modified: trunk/freenet/src/freenet/node/PeerMessageQueue.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerMessageQueue.java        2008-09-23 
23:16:29 UTC (rev 22785)
+++ trunk/freenet/src/freenet/node/PeerMessageQueue.java        2008-09-23 
23:22:20 UTC (rev 22786)
@@ -21,6 +21,7 @@
        private class PrioQueue {
                LinkedList<MessageItem> itemsNoID;
                ArrayList<LinkedList<MessageItem>> itemsWithID;
+               ArrayList<Long> itemsIDs;
                Map<Long, LinkedList<MessageItem>> itemsByID;
                // Construct structures lazily, we're protected by the overall 
synchronized.

@@ -47,6 +48,7 @@
                                itemsWithID = new 
ArrayList<LinkedList<MessageItem>>();
                                list = new LinkedList<MessageItem>();
                                itemsWithID.add(list);
+                               itemsIDs.add(id);
                                itemsByID.put(id, list);
                        } else {
                                list = itemsByID.get(id);
@@ -54,6 +56,7 @@
                                        list = new LinkedList<MessageItem>();
                                        itemsWithID.add(list);
                                        itemsByID.put(id, list);
+                                       itemsIDs.add(id);
                                }
                        }
                        list.addLast(item);
@@ -78,12 +81,14 @@
                                itemsWithID = new 
ArrayList<LinkedList<MessageItem>>();
                                list = new LinkedList<MessageItem>();
                                itemsWithID.add(list);
+                               itemsIDs.add(id);
                                itemsByID.put(id, list);
                        } else {
                                list = itemsByID.get(id);
                                if(list == null) {
                                        list = new LinkedList<MessageItem>();
                                        itemsWithID.add(list);
+                                       itemsIDs.add(id);
                                        itemsByID.put(id, list);
                                }
                        }
@@ -163,11 +168,17 @@
                        for(int i=0;i<lists;i++) {
                                LinkedList<MessageItem> list;
                                int l = (i + roundRobinCounter) % lists;
+                               int listNum = -1;
                                if(itemsNoID != null) {
                                        if(l == 0) list = itemsNoID;
-                                       else list = itemsWithID.get(l-1);
-                               } else
+                                       else {
+                                               listNum = l-1;
+                                               list = itemsWithID.get(listNum);
+                                       }
+                               } else {
+                                       listNum = l;
                                        list = itemsWithID.get(l);
+                               }

                                while(true) {
                                        if(list.isEmpty()) continue;
@@ -179,6 +190,15 @@
                                                                // Send it 
anyway, nothing else to send.
                                                                size += 2 + 
thisSize;
                                                                
list.removeFirst();
+                                                               
if(list.isEmpty()) {
+                                                                       if(list 
== itemsNoID) itemsNoID = null;
+                                                                       else {
+                                                                               
Long id = itemsIDs.get(listNum);
+                                                                               
itemsWithID.remove(listNum);
+                                                                               
itemsIDs.remove(listNum);
+                                                                               
itemsByID.remove(id);
+                                                                       }
+                                                               }
                                                                
messages.add(item);
                                                                
roundRobinCounter = i;
                                                                return size;
@@ -187,6 +207,15 @@
                                                }
                                                size += 2 + thisSize;
                                                list.removeFirst();
+                                               if(list.isEmpty()) {
+                                                       if(list == itemsNoID) 
itemsNoID = null;
+                                                       else {
+                                                               Long id = 
itemsIDs.get(listNum);
+                                                               
itemsWithID.remove(listNum);
+                                                               
itemsIDs.remove(listNum);
+                                                               
itemsByID.remove(id);
+                                                       }
+                                               }
                                                messages.add(item);
                                                roundRobinCounter = i;
                                        } else {
@@ -215,11 +244,17 @@
                        for(int i=0;i<lists;i++) {
                                LinkedList<MessageItem> list;
                                int l = (i + roundRobinCounter) % lists;
+                               int listNum = -1;
                                if(itemsNoID != null) {
                                        if(l == 0) list = itemsNoID;
-                                       else list = itemsWithID.get(l-1);
-                               } else
+                                       else {
+                                               listNum = l-1;
+                                               list = itemsWithID.get(listNum);
+                                       }
+                               } else {
+                                       listNum = l;
                                        list = itemsWithID.get(l);
+                               }

                                while(true) {
                                        if(list.isEmpty()) continue;
@@ -230,6 +265,15 @@
                                                        // Send it anyway, 
nothing else to send.
                                                        size += 2 + thisSize;
                                                        list.removeFirst();
+                                                       if(list.isEmpty()) {
+                                                               if(list == 
itemsNoID) itemsNoID = null;
+                                                               else {
+                                                                       Long id 
= itemsIDs.get(listNum);
+                                                                       
itemsWithID.remove(listNum);
+                                                                       
itemsIDs.remove(listNum);
+                                                                       
itemsByID.remove(id);
+                                                               }
+                                                       }
                                                        messages.add(item);
                                                        roundRobinCounter = i;
                                                        return size;
@@ -238,6 +282,15 @@
                                        }
                                        size += 2 + thisSize;
                                        list.removeFirst();
+                                       if(list.isEmpty()) {
+                                               if(list == itemsNoID) itemsNoID 
= null;
+                                               else {
+                                                       Long id = 
itemsIDs.get(listNum);
+                                                       
itemsWithID.remove(listNum);
+                                                       
itemsIDs.remove(listNum);
+                                                       itemsByID.remove(id);
+                                               }
+                                       }
                                        messages.add(item);
                                        roundRobinCounter = i;
                                }


Reply via email to