remove a bunch of locks

This commit is contained in:
Vinzenz Schroeter 2024-05-03 14:45:41 +02:00 committed by RobbersDaughter
parent b3bf62b391
commit d7b8664062
13 changed files with 126 additions and 143 deletions

View file

@ -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();
}
}