From 71327c03ca8b661d2aa371c73fee4d6eaa474412 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 1 Apr 2020 10:03:30 -0700 Subject: [PATCH] Try synchronizing dispose and output (#20341) --- src/Shared/Process/ProcessEx.cs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Shared/Process/ProcessEx.cs b/src/Shared/Process/ProcessEx.cs index c1743a2f0a..3f5ca0aead 100644 --- a/src/Shared/Process/ProcessEx.cs +++ b/src/Shared/Process/ProcessEx.cs @@ -26,9 +26,11 @@ namespace Microsoft.AspNetCore.Internal private readonly StringBuilder _stderrCapture; private readonly StringBuilder _stdoutCapture; private readonly object _pipeCaptureLock = new object(); + private readonly object _testOutputLock = new object(); private BlockingCollection _stdoutLines; private TaskCompletionSource _exited; private CancellationTokenSource _stdoutLinesCancellationSource = new CancellationTokenSource(TimeSpan.FromMinutes(5)); + private bool _disposed = false; public ProcessEx(ITestOutputHelper output, Process proc) { @@ -135,7 +137,13 @@ namespace Microsoft.AspNetCore.Internal _stderrCapture.AppendLine(e.Data); } - _output.WriteLine("[ERROR] " + e.Data); + lock (_testOutputLock) + { + if (!_disposed) + { + _output.WriteLine("[ERROR] " + e.Data); + } + } } private void OnOutputData(object sender, DataReceivedEventArgs e) @@ -150,7 +158,13 @@ namespace Microsoft.AspNetCore.Internal _stdoutCapture.AppendLine(e.Data); } - _output.WriteLine(e.Data); + lock (_testOutputLock) + { + if (!_disposed) + { + _output.WriteLine(e.Data); + } + } if (_stdoutLines != null) { @@ -204,6 +218,11 @@ namespace Microsoft.AspNetCore.Internal public void Dispose() { + lock (_testOutputLock) + { + _disposed = true; + } + if (_process != null && !_process.HasExited) { _process.KillTree();