diff --git a/FFMpegCore.Test/FFMpegArgumentProcessorTest.cs b/FFMpegCore.Test/FFMpegArgumentProcessorTest.cs index 1820b9b..daf2d9a 100644 --- a/FFMpegCore.Test/FFMpegArgumentProcessorTest.cs +++ b/FFMpegCore.Test/FFMpegArgumentProcessorTest.cs @@ -15,7 +15,7 @@ public class FFMpegArgumentProcessorTest [TestMethod] public void Processor_GlobalOptions_GetUsed() { - var globalWorkingDir = "Whatever"; + var globalWorkingDir = "Whatever1"; var processor = CreateArgumentProcessor(); try @@ -47,7 +47,7 @@ public class FFMpegArgumentProcessorTest [TestMethod] public void Processor_Options_CanBeOverridden_And_Configured() { - var globalConfig = "Whatever"; + var globalConfig = "Whatever2"; try { @@ -59,14 +59,14 @@ public class FFMpegArgumentProcessorTest var overrideOptions = new FFOptions { WorkingDirectory = "override" }; GlobalFFOptions.Configure(new FFOptions { WorkingDirectory = globalConfig, TemporaryFilesFolder = globalConfig, BinaryFolder = globalConfig }); - var options = processor.GetConfiguredOptions(overrideOptions); + var configuredOptions = processor.GetConfiguredOptions(overrideOptions); - Assert.AreEqual(options.WorkingDirectory, overrideOptions.WorkingDirectory); - Assert.AreEqual(options.TemporaryFilesFolder, overrideOptions.TemporaryFilesFolder); - Assert.AreEqual(options.BinaryFolder, overrideOptions.BinaryFolder); + Assert.AreEqual(configuredOptions.WorkingDirectory, overrideOptions.WorkingDirectory); + Assert.AreEqual(configuredOptions.TemporaryFilesFolder, overrideOptions.TemporaryFilesFolder); + Assert.AreEqual(configuredOptions.BinaryFolder, overrideOptions.BinaryFolder); - Assert.AreEqual(sessionTempDir, options.TemporaryFilesFolder); - Assert.AreNotEqual(globalConfig, options.BinaryFolder); + Assert.AreEqual(sessionTempDir, configuredOptions.TemporaryFilesFolder); + Assert.AreNotEqual(globalConfig, configuredOptions.BinaryFolder); } finally { @@ -77,7 +77,7 @@ public class FFMpegArgumentProcessorTest [TestMethod] public void Options_Global_And_Session_Options_Can_Differ() { - var globalWorkingDir = "Whatever"; + var globalWorkingDir = "Whatever3"; try { diff --git a/FFMpegCore/FFMpeg/Arguments/PipeArgument.cs b/FFMpegCore/FFMpeg/Arguments/PipeArgument.cs index 5a809f7..4011c23 100644 --- a/FFMpegCore/FFMpeg/Arguments/PipeArgument.cs +++ b/FFMpegCore/FFMpeg/Arguments/PipeArgument.cs @@ -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(); + } } } }