Use ObjectPool in ConcurrentQueue
authorJérémie Laval <jeremie.laval@gmail.com>
Mon, 14 Feb 2011 18:10:21 +0000 (18:10 +0000)
committerJérémie Laval <jeremie.laval@gmail.com>
Mon, 14 Feb 2011 18:12:41 +0000 (18:12 +0000)
mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs

index 1be5ccf2f020b9ba0b95e895a731b62e33a91666..18e0f58ba448bf2aafdb92529afa7670e391c890 100644 (file)
@@ -48,6 +48,21 @@ namespace System.Collections.Concurrent
                Node tail;
                int count;
 
+               class NodeObjectPool : ObjectPool<Node> {
+                       protected override Node Creator ()
+                       {
+                               return new Node ();
+                       }
+               }
+               static readonly NodeObjectPool pool = new NodeObjectPool ();
+
+               static Node ZeroOut (Node node)
+               {
+                       node.Value = default(T);
+                       node.Next = null;
+                       return node;
+               }
+
                public ConcurrentQueue ()
                {
                        tail = head;
@@ -61,7 +76,7 @@ namespace System.Collections.Concurrent
                
                public void Enqueue (T item)
                {
-                       Node node  = new Node ();
+                       Node node = pool.Take ();
                        node.Value = item;
                        
                        Node oldTail = null;
@@ -118,6 +133,8 @@ namespace System.Collections.Concurrent
                                        } else {
                                                result = oldNext.Value;
                                                advanced = Interlocked.CompareExchange (ref head, oldNext, oldHead) == oldHead;
+                                               if (advanced)
+                                                       pool.Release (ZeroOut (oldHead));
                                        }
                                }
                        }