Merge pull request #571 from techtel-pstevens/main

Fixed race condition on Named pipe dispose/disconnect
This commit is contained in:
Malte Rosenbjerg 2025-10-17 15:43:57 +02:00 committed by GitHub
commit cf775ae7a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -7,6 +7,7 @@ namespace FFMpegCore.Arguments;
public abstract class PipeArgument
{
private readonly PipeDirection _direction;
private readonly object _pipeLock = new();
protected PipeArgument(PipeDirection direction)
{
@ -22,19 +23,25 @@ public abstract class PipeArgument
public void Pre()
{
if (Pipe != null)
lock (_pipeLock)
{
throw new InvalidOperationException("Pipe already has been opened");
}
if (Pipe != null)
{
throw new InvalidOperationException("Pipe already has been opened");
}
Pipe = new NamedPipeServerStream(PipeName, _direction, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
Pipe = new NamedPipeServerStream(PipeName, _direction, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
}
}
public void Post()
{
Debug.WriteLine($"Disposing NamedPipeServerStream on {GetType().Name}");
Pipe?.Dispose();
Pipe = null!;
lock (_pipeLock)
{
Pipe?.Dispose();
Pipe = null!;
}
}
public async Task During(CancellationToken cancellationToken = default)
@ -50,9 +57,12 @@ public abstract class PipeArgument
finally
{
Debug.WriteLine($"Disconnecting NamedPipeServerStream on {GetType().Name}");
if (Pipe is { IsConnected: true })
lock (_pipeLock)
{
Pipe.Disconnect();
if (Pipe is { IsConnected: true })
{
Pipe.Disconnect();
}
}
}
}