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 public abstract class PipeArgument
{ {
private readonly PipeDirection _direction; private readonly PipeDirection _direction;
private readonly object _pipeLock = new();
protected PipeArgument(PipeDirection direction) protected PipeArgument(PipeDirection direction)
{ {
@ -22,19 +23,25 @@ public abstract class PipeArgument
public void Pre() 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() public void Post()
{ {
Debug.WriteLine($"Disposing NamedPipeServerStream on {GetType().Name}"); Debug.WriteLine($"Disposing NamedPipeServerStream on {GetType().Name}");
Pipe?.Dispose(); lock (_pipeLock)
Pipe = null!; {
Pipe?.Dispose();
Pipe = null!;
}
} }
public async Task During(CancellationToken cancellationToken = default) public async Task During(CancellationToken cancellationToken = default)
@ -50,9 +57,12 @@ public abstract class PipeArgument
finally finally
{ {
Debug.WriteLine($"Disconnecting NamedPipeServerStream on {GetType().Name}"); Debug.WriteLine($"Disconnecting NamedPipeServerStream on {GetType().Name}");
if (Pipe is { IsConnected: true }) lock (_pipeLock)
{ {
Pipe.Disconnect(); if (Pipe is { IsConnected: true })
{
Pipe.Disconnect();
}
} }
} }
} }