Node head = null;
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 ConcurrentStack ()
{
public void Push (T item)
{
- Node temp = new Node ();
+ Node temp = pool.Take ();
temp.Value = item;
do {
temp.Next = head;
Node first = null;
for (int i = startIndex; i < count; i++) {
- Node temp = new Node ();
+ Node temp = pool.Take ();
temp.Value = items[i];
temp.Next = insert;
insert = temp;
Interlocked.Decrement (ref count);
result = temp.Value;
+ pool.Release (ZeroOut (temp));
+
return true;
}
int i;
for (i = startIndex; i < count && temp != null; i++) {
items[i] = temp.Value;
+ end = temp;
temp = temp.Next;
+ pool.Release (ZeroOut (end));
}
return i - 1;