Skip to content

Commit 439f4a1

Browse files
authored
Merge pull request #156 from cnblogs/use-ConcurrentStack
Replace InterlockedStack with ConcurrentStack
2 parents 778914b + ac54c93 commit 439f4a1

File tree

2 files changed

+51
-49
lines changed

2 files changed

+51
-49
lines changed

Enyim.Caching/InterlockedStack.cs

+48-47
Original file line numberDiff line numberDiff line change
@@ -3,77 +3,78 @@
33

44
namespace Enyim.Collections
55
{
6-
/// <summary>
7-
/// Implements a non-locking stack.
8-
/// </summary>
9-
/// <typeparam name="TItem"></typeparam>
10-
public class InterlockedStack<TItem>
11-
{
12-
private Node head;
6+
/// <summary>
7+
/// Implements a non-locking stack.
8+
/// </summary>
9+
/// <typeparam name="TItem"></typeparam>
10+
[Obsolete]
11+
public class InterlockedStack<TItem>
12+
{
13+
private Node head;
1314

14-
public InterlockedStack()
15-
{
16-
this.head = new Node(default(TItem));
17-
}
15+
public InterlockedStack()
16+
{
17+
this.head = new Node(default(TItem));
18+
}
1819

19-
public void Push(TItem item)
20-
{
21-
var node = new Node(item);
20+
public void Push(TItem item)
21+
{
22+
var node = new Node(item);
2223

23-
do { node.Next = this.head.Next; }
24-
while (Interlocked.CompareExchange(ref this.head.Next, node, node.Next) != node.Next);
25-
}
24+
do { node.Next = this.head.Next; }
25+
while (Interlocked.CompareExchange(ref this.head.Next, node, node.Next) != node.Next);
26+
}
2627

27-
public bool TryPop(out TItem value)
28-
{
29-
value = default(TItem);
30-
Node node;
28+
public bool TryPop(out TItem value)
29+
{
30+
value = default(TItem);
31+
Node node;
3132

32-
do
33-
{
34-
node = head.Next;
35-
if (node == null) return false;
36-
}
37-
while (Interlocked.CompareExchange(ref head.Next, node.Next, node) != node);
33+
do
34+
{
35+
node = head.Next;
36+
if (node == null) return false;
37+
}
38+
while (Interlocked.CompareExchange(ref head.Next, node.Next, node) != node);
3839

39-
value = node.Value;
40+
value = node.Value;
4041

41-
return true;
42-
}
42+
return true;
43+
}
4344

44-
#region [ Node ]
45+
#region [ Node ]
4546

46-
private class Node
47-
{
48-
public readonly TItem Value;
49-
public Node Next;
47+
private class Node
48+
{
49+
public readonly TItem Value;
50+
public Node Next;
5051

51-
public Node(TItem value)
52-
{
53-
this.Value = value;
54-
}
55-
}
52+
public Node(TItem value)
53+
{
54+
this.Value = value;
55+
}
56+
}
5657

57-
#endregion
58-
}
58+
#endregion
59+
}
5960
}
6061

6162
#region [ License information ]
6263
/* ************************************************************
63-
*
64+
*
6465
* Copyright (c) 2010 Attila Kiskó, enyim.com
65-
*
66+
*
6667
* Licensed under the Apache License, Version 2.0 (the "License");
6768
* you may not use this file except in compliance with the License.
6869
* You may obtain a copy of the License at
69-
*
70+
*
7071
* http://www.apache.org/licenses/LICENSE-2.0
71-
*
72+
*
7273
* Unless required by applicable law or agreed to in writing, software
7374
* distributed under the License is distributed on an "AS IS" BASIS,
7475
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7576
* See the License for the specific language governing permissions and
7677
* limitations under the License.
77-
*
78+
*
7879
* ************************************************************/
7980
#endregion

Enyim.Caching/Memcached/MemcachedNode.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Enyim.Collections;
66
using Microsoft.Extensions.Logging;
77
using System;
8+
using System.Collections.Concurrent;
89
using System.Collections.Generic;
910
using System.Diagnostics;
1011
using System.IO;
@@ -266,7 +267,7 @@ private class InternalPoolImpl : IDisposable
266267
/// <summary>
267268
/// A list of already connected but free to use sockets
268269
/// </summary>
269-
private InterlockedStack<PooledSocket> _freeItems;
270+
private ConcurrentStack<PooledSocket> _freeItems;
270271

271272
private bool isDisposed;
272273
private bool isAlive;
@@ -307,7 +308,7 @@ internal InternalPoolImpl(
307308
this.maxItems = config.MaxPoolSize;
308309

309310
_semaphore = new SemaphoreSlim(maxItems, maxItems);
310-
_freeItems = new InterlockedStack<PooledSocket>();
311+
_freeItems = new ConcurrentStack<PooledSocket>();
311312

312313
_logger = logger;
313314
_isDebugEnabled = _logger.IsEnabled(LogLevel.Debug);

0 commit comments

Comments
 (0)