potential fix for locking issues

This commit is contained in:
Vinzenz Schroeter 2024-04-28 15:34:32 +02:00
parent 7044ffda79
commit c0172963d5
20 changed files with 112 additions and 141 deletions

View file

@ -3,8 +3,9 @@ namespace TanksServer.Interactivity;
internal abstract class WebsocketServerConnection(
ILogger logger,
ByteChannelWebSocket socket
)
) : IDisposable
{
private readonly SemaphoreSlim _mutex = new(1);
protected readonly ByteChannelWebSocket Socket = socket;
protected readonly ILogger Logger = logger;
@ -17,9 +18,24 @@ internal abstract class WebsocketServerConnection(
public async Task ReceiveAsync()
{
await foreach (var buffer in Socket.ReadAllAsync())
await HandleMessageAsync(buffer);
await LockedAsync(() => HandleMessageLockedAsync(buffer));
Logger.LogTrace("done receiving");
}
protected abstract ValueTask HandleMessageAsync(Memory<byte> buffer);
protected abstract ValueTask HandleMessageLockedAsync(Memory<byte> buffer);
protected async ValueTask LockedAsync(Func<ValueTask> action)
{
await _mutex.WaitAsync();
try
{
await action();
}
finally
{
_mutex.Release();
}
}
public void Dispose() => _mutex.Dispose();
}