From: Jérémie Laval Date: Fri, 30 May 2014 18:50:35 +0000 (-0400) Subject: Merge pull request #1068 from esdrubal/bug18421 X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=610d1e7aaff5bb0d98875ecaba32581e360b805c;hp=103fd26cbb781ecf436924b2a49b214d0d7470c1;p=mono.git Merge pull request #1068 from esdrubal/bug18421 Changed ConcurrentQueue to remove last ref/value. Fixes 18421 --- diff --git a/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs b/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs index d19cc4cec7d..aff2492e021 100644 --- a/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs +++ b/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs @@ -97,12 +97,13 @@ namespace System.Collections.Concurrent public bool TryDequeue (out T result) { result = default (T); + Node oldNext = null; bool advanced = false; while (!advanced) { Node oldHead = head; Node oldTail = tail; - Node oldNext = oldHead.Next; + oldNext = oldHead.Next; if (oldHead == head) { // Empty case ? @@ -122,6 +123,8 @@ namespace System.Collections.Concurrent } } + oldNext.Value = default (T); + Interlocked.Decrement (ref count); return true; diff --git a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs index b0006440afa..80313356fe2 100644 --- a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs +++ b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs @@ -215,6 +215,28 @@ namespace MonoTests.System.Collections.Concurrent { queue.CopyTo (new int[3], 0); } + + static WeakReference CreateWeakReference (object obj) + { + return new WeakReference (obj); + } + + [Test] + public void TryDequeueReferenceTest () + { + var obj = new Object (); + var weakReference = CreateWeakReference(obj); + var queue = new ConcurrentQueue (); + + queue.Enqueue (obj); + queue.TryDequeue (out obj); + obj = null; + + GC.Collect (); + GC.WaitForPendingFinalizers (); + + Assert.IsFalse (weakReference.IsAlive); + } } } #endif