From 7d16d0664e7d5395bcafac1ece6a87fe231ea598 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 23 Jul 2012 19:21:59 +0100 Subject: [PATCH 1/2] Commiting Avination's memleak fix-a-thon, installment #1 As the MinHeap shrinks, free object references that have been sent. Also, free the last item when it empties. --- OpenSim/Framework/MinHeap.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/MinHeap.cs b/OpenSim/Framework/MinHeap.cs index 33d0364b6e..99ac25d09d 100644 --- a/OpenSim/Framework/MinHeap.cs +++ b/OpenSim/Framework/MinHeap.cs @@ -63,12 +63,15 @@ namespace OpenSim.Framework internal void Clear() { - this.value = default(T); if (this.handle != null) - { this.handle.Clear(); - this.handle = null; - } + ClearRef(); + } + + internal void ClearRef() + { + this.value = default(T); + this.handle = null; } } @@ -285,6 +288,7 @@ namespace OpenSim.Framework if (--this.size > 0 && index != this.size) { Set(this.items[this.size], index); + this.items[this.size].ClearRef(); if (!BubbleUp(index)) BubbleDown(index); } From 55c1c10c0dc3f189107ab43b43988a8b8833f136 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 23 Jul 2012 19:26:21 +0100 Subject: [PATCH 2/2] Committing Avination's memleak fix-a-thon, installment #2 Ensure items coming off the lockless queue are released. Also ensure this is done when the queue is cleared. --- OpenSim/Framework/LocklessQueue.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/LocklessQueue.cs b/OpenSim/Framework/LocklessQueue.cs index dd3d2016d1..84f887cc4d 100644 --- a/OpenSim/Framework/LocklessQueue.cs +++ b/OpenSim/Framework/LocklessQueue.cs @@ -99,8 +99,13 @@ namespace OpenSim.Framework } else { - item = oldHeadNext.Item; + item = oldHeadNext.Item; haveAdvancedHead = CAS(ref head, oldHead, oldHeadNext); + if (haveAdvancedHead) + { + oldHeadNext.Item = default(T); + oldHead.Next = null; + } } } } @@ -111,6 +116,10 @@ namespace OpenSim.Framework public void Clear() { + // ugly + T item; + while(count > 0) + Dequeue(out item); Init(); }