remove a bunch of locks
This commit is contained in:
parent
b3bf62b391
commit
d7b8664062
13 changed files with 126 additions and 143 deletions
|
@ -6,25 +6,30 @@ using TanksServer.GameLogic;
|
|||
|
||||
namespace TanksServer.Interactivity;
|
||||
|
||||
// MemoryStream is IDisposable but does not need to be disposed
|
||||
#pragma warning disable CA1001
|
||||
internal sealed class PlayerInfoConnection : WebsocketServerConnection
|
||||
#pragma warning restore CA1001
|
||||
{
|
||||
private readonly Player _player;
|
||||
private readonly MapEntityManager _entityManager;
|
||||
private readonly BufferPool _bufferPool;
|
||||
private readonly MemoryStream _tempStream = new();
|
||||
private readonly MemoryPool<byte> _memoryPool = MemoryPool<byte>.Shared;
|
||||
private int _wantsInfoOnTick = 1;
|
||||
private Package? _lastMessage = null;
|
||||
private Package? _nextMessage = null;
|
||||
private IMemoryOwner<byte>? _lastMessage = null;
|
||||
private IMemoryOwner<byte>? _nextMessage = null;
|
||||
|
||||
private sealed record class Package(IMemoryOwner<byte> Owner, Memory<byte> Memory);
|
||||
|
||||
public PlayerInfoConnection(Player player,
|
||||
public PlayerInfoConnection(
|
||||
Player player,
|
||||
ILogger logger,
|
||||
WebSocket rawSocket,
|
||||
MapEntityManager entityManager) : base(logger, new ByteChannelWebSocket(rawSocket, logger, 0))
|
||||
MapEntityManager entityManager,
|
||||
BufferPool bufferPool
|
||||
) : base(logger, new ByteChannelWebSocket(rawSocket, logger, 0))
|
||||
{
|
||||
_player = player;
|
||||
_entityManager = entityManager;
|
||||
_bufferPool = bufferPool;
|
||||
_player.IncrementConnectionCount();
|
||||
}
|
||||
|
||||
|
@ -38,7 +43,7 @@ internal sealed class PlayerInfoConnection : WebsocketServerConnection
|
|||
return ValueTask.CompletedTask;
|
||||
}
|
||||
|
||||
public async ValueTask OnGameTickAsync()
|
||||
public async Task OnGameTickAsync()
|
||||
{
|
||||
await Task.Yield();
|
||||
|
||||
|
@ -60,7 +65,7 @@ internal sealed class PlayerInfoConnection : WebsocketServerConnection
|
|||
return ValueTask.CompletedTask;
|
||||
}
|
||||
|
||||
private async ValueTask<Package> GenerateMessageAsync()
|
||||
private async ValueTask<IMemoryOwner<byte>> GenerateMessageAsync()
|
||||
{
|
||||
var tank = _entityManager.GetCurrentTankOfPlayer(_player);
|
||||
|
||||
|
@ -82,17 +87,16 @@ internal sealed class PlayerInfoConnection : WebsocketServerConnection
|
|||
await JsonSerializer.SerializeAsync(_tempStream, info, AppSerializerContext.Default.PlayerInfo);
|
||||
|
||||
var messageLength = (int)_tempStream.Position;
|
||||
var owner = _memoryPool.Rent(messageLength);
|
||||
var package = new Package(owner, owner.Memory[..messageLength]);
|
||||
var owner = _bufferPool.Rent(messageLength);
|
||||
|
||||
_tempStream.Position = 0;
|
||||
await _tempStream.ReadExactlyAsync(package.Memory);
|
||||
return package;
|
||||
await _tempStream.ReadExactlyAsync(owner.Memory);
|
||||
return owner;
|
||||
}
|
||||
|
||||
private async ValueTask SendAndDisposeAsync(Package data)
|
||||
private async ValueTask SendAndDisposeAsync(IMemoryOwner<byte> data)
|
||||
{
|
||||
await Socket.SendTextAsync(data.Memory);
|
||||
Interlocked.Exchange(ref _lastMessage, data)?.Owner.Dispose();
|
||||
Interlocked.Exchange(ref _lastMessage, data)?.Dispose();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue