mirror of
https://github.com/MikuLeaks/KianaBH3.git
synced 2025-12-13 21:34:43 +01:00
Init enter game
This commit is contained in:
76
KcpSharp/Base/KcpSendReceiveQueueItemCache.cs
Normal file
76
KcpSharp/Base/KcpSendReceiveQueueItemCache.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
#if NEED_LINKEDLIST_SHIM
|
||||
using LinkedListOfQueueItem = KcpSharp.NetstandardShim.LinkedList<(KcpSharp.KcpBuffer Data, byte Fragment)>;
|
||||
using LinkedListNodeOfQueueItem = KcpSharp.NetstandardShim.LinkedListNode<(KcpSharp.KcpBuffer Data, byte Fragment)>;
|
||||
#else
|
||||
using LinkedListNodeOfQueueItem =
|
||||
System.Collections.Generic.LinkedListNode<(KianaBH.KcpSharp.Base.KcpBuffer Data, byte Fragment
|
||||
)>;
|
||||
using LinkedListOfQueueItem =
|
||||
System.Collections.Generic.LinkedList<(KianaBH.KcpSharp.Base.KcpBuffer Data, byte Fragment)>;
|
||||
#endif
|
||||
|
||||
namespace KianaBH.KcpSharp.Base;
|
||||
|
||||
internal sealed class KcpSendReceiveQueueItemCache
|
||||
{
|
||||
private readonly LinkedListOfQueueItem _list = new();
|
||||
private SpinLock _lock;
|
||||
|
||||
public LinkedListNodeOfQueueItem Rent(in KcpBuffer buffer, byte fragment)
|
||||
{
|
||||
var lockTaken = false;
|
||||
try
|
||||
{
|
||||
_lock.Enter(ref lockTaken);
|
||||
|
||||
var node = _list.First;
|
||||
if (node is null)
|
||||
{
|
||||
node = new LinkedListNodeOfQueueItem((buffer, fragment));
|
||||
}
|
||||
else
|
||||
{
|
||||
node.ValueRef = (buffer, fragment);
|
||||
_list.RemoveFirst();
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (lockTaken) _lock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
public void Return(LinkedListNodeOfQueueItem node)
|
||||
{
|
||||
node.ValueRef = default;
|
||||
|
||||
var lockTaken = false;
|
||||
try
|
||||
{
|
||||
_lock.Enter(ref lockTaken);
|
||||
|
||||
_list.AddLast(node);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (lockTaken) _lock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
var lockTaken = false;
|
||||
try
|
||||
{
|
||||
_lock.Enter(ref lockTaken);
|
||||
|
||||
_list.Clear();
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (lockTaken) _lock.Exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user