Overwrites dequeued ref/value with default. Fixes 18421.
authormarcos henrich <marcoshenrich@gmail.com>
Thu, 29 May 2014 16:53:32 +0000 (17:53 +0100)
committermarcos henrich <marcoshenrich@gmail.com>
Thu, 29 May 2014 16:53:32 +0000 (17:53 +0100)
ConcurrentQueue was keeping the last dequeued ref/value.

mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs

index d19cc4cec7d405515b9e0219798a29af7da44e4a..aff2492e0216df7ba60de976dbaf34a158b26fae 100644 (file)
@@ -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;