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;
}
