Files
netch/Netch/3rd/DnsClient.NET/Internal/StringBuilderObjectPool.cs
Connection Refused b2ea730984 done
2019-12-02 19:51:12 +08:00

77 lines
2.2 KiB
C#

#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
using System.Text;
using System.Threading;
namespace DnsClient.Internal
{
public class StringBuilderObjectPool
{
private readonly StringBuilder[] _items;
private readonly int _initialCapacity;
private readonly int _maxPooledCapacity;
private StringBuilder _fastAccess;
public static StringBuilderObjectPool Default { get; } = new StringBuilderObjectPool();
public StringBuilderObjectPool(int pooledItems = 16, int initialCapacity = 200, int maxPooledCapacity = 1024 * 2)
{
_items = new StringBuilder[pooledItems];
_initialCapacity = initialCapacity;
_maxPooledCapacity = maxPooledCapacity;
_fastAccess = Create();
}
public StringBuilder Get()
{
//return Create();
var found = _fastAccess;
if (found == null || Interlocked.CompareExchange(ref _fastAccess, null, found) != found)
{
for (var i = 0; i < _items.Length; i++)
{
found = _items[i];
if (found != null && Interlocked.CompareExchange(ref _items[i], null, found) == found)
{
return found;
}
}
}
return found ?? Create();
}
public void Return(StringBuilder value)
{
//return;
if (value == null || value.Capacity > _maxPooledCapacity)
{
return;
}
value.Clear();
if (_fastAccess == null && Interlocked.CompareExchange(ref _fastAccess, value, null) == null)
{
return;
}
for (var i = 0; i < _items.Length; i++)
{
if (Interlocked.CompareExchange(ref _items[i], value, null) == null)
{
return;
}
}
}
private StringBuilder Create()
{
return new StringBuilder(_initialCapacity);
}
}
}
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member