From 7c52a7bf5fe10f70b547b37f757a9ad022d29d1f Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Thu, 29 May 2014 17:53:32 +0100 Subject: [PATCH] Overwrites dequeued ref/value with default. Fixes 18421. ConcurrentQueue was keeping the last dequeued ref/value. --- .../corlib/System.Collections.Concurrent/ConcurrentQueue.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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; -- 2.25.1