mirror of
https://github.com/MikuLeaks/KianaBH3.git
synced 2025-12-13 13:24:34 +01:00
68 lines
1.8 KiB
C#
68 lines
1.8 KiB
C#
#if NEED_LINKEDLIST_SHIM
|
|
using LinkedListOfBufferItem = KcpSharp.NetstandardShim.LinkedList<KcpSharp.KcpSendReceiveBufferItem>;
|
|
using LinkedListNodeOfBufferItem = KcpSharp.NetstandardShim.LinkedListNode<KcpSharp.KcpSendReceiveBufferItem>;
|
|
#else
|
|
using LinkedListNodeOfBufferItem =
|
|
System.Collections.Generic.LinkedListNode<KianaBH.KcpSharp.Base.KcpSendReceiveBufferItem>;
|
|
using LinkedListOfBufferItem =
|
|
System.Collections.Generic.LinkedList<KianaBH.KcpSharp.Base.KcpSendReceiveBufferItem>;
|
|
#endif
|
|
|
|
namespace KianaBH.KcpSharp.Base;
|
|
|
|
internal struct KcpSendReceiveBufferItemCache
|
|
{
|
|
private LinkedListOfBufferItem _items;
|
|
private SpinLock _lock;
|
|
|
|
public static KcpSendReceiveBufferItemCache Create()
|
|
{
|
|
return new KcpSendReceiveBufferItemCache
|
|
{
|
|
_items = new LinkedListOfBufferItem(),
|
|
_lock = new SpinLock()
|
|
};
|
|
}
|
|
|
|
public LinkedListNodeOfBufferItem Allocate(in KcpSendReceiveBufferItem item)
|
|
{
|
|
var lockAcquired = false;
|
|
try
|
|
{
|
|
_lock.Enter(ref lockAcquired);
|
|
|
|
var node = _items.First;
|
|
if (node is null)
|
|
{
|
|
node = new LinkedListNodeOfBufferItem(item);
|
|
}
|
|
else
|
|
{
|
|
_items.Remove(node);
|
|
node.ValueRef = item;
|
|
}
|
|
|
|
return node;
|
|
}
|
|
finally
|
|
{
|
|
if (lockAcquired) _lock.Exit();
|
|
}
|
|
}
|
|
|
|
public void Return(LinkedListNodeOfBufferItem node)
|
|
{
|
|
var lockAcquired = false;
|
|
try
|
|
{
|
|
_lock.Enter(ref lockAcquired);
|
|
|
|
node.ValueRef = default;
|
|
_items.AddLast(node);
|
|
}
|
|
finally
|
|
{
|
|
if (lockAcquired) _lock.Exit();
|
|
}
|
|
}
|
|
} |