Skip to content

Commit

Permalink
Read StandardOutput in a smart way to avoid infinite loops (#830), #828
Browse files Browse the repository at this point in the history
* Minor fix

Potential fix for SynchronousProcessOutputLoggerWithDiagnoser infinite loop.
Added time in Execute, detected freeze during UnitTest.

* Adding timeout to basestream read.

* Stream doesn't support timeout.

* Enhancing ProcessInput

* Minor tweak.

Disabling Executor timeout in Toolchains.
Adjusting While loop and comments on Process
  • Loading branch information
houseofcat authored and adamsitnik committed Jul 17, 2018
1 parent cdbb373 commit eac8336
Showing 1 changed file with 17 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,22 +38,27 @@ public SynchronousProcessOutputLoggerWithDiagnoser(ILogger logger, Process proce
internal void ProcessInput()
{
string line;
while ((line = process.StandardOutput.ReadLine()) != null)
{
logger.WriteLine(LogKind.Default, line);

if (string.IsNullOrEmpty(line))
continue;
// Peek -1 or 0 can indicate internal error.
while (!process.StandardOutput.EndOfStream && process.StandardOutput.Peek() > 0)
{
// ReadLine() can actually return string.Empty and null as valid values.
line = process.StandardOutput.ReadLine();

if (!line.StartsWith("//"))
LinesWithResults.Add(line);
else if (Engine.Signals.TryGetSignal(line, out var signal))
if (!string.IsNullOrEmpty(line)) // Skip bad data.
{
diagnoser?.Handle(signal, diagnoserActionParameters);
process.StandardInput.WriteLine(Engine.Signals.Acknowledgment);
logger.WriteLine(LogKind.Default, line);

if (!line.StartsWith("//"))
{ LinesWithResults.Add(line); }
else if (Engine.Signals.TryGetSignal(line, out var signal))
{
diagnoser?.Handle(signal, diagnoserActionParameters);
process.StandardInput.WriteLine(Engine.Signals.Acknowledgment);
}
else
{ LinesWithExtraOutput.Add(line); }
}
else
LinesWithExtraOutput.Add(line);
}
}
}
Expand Down

0 comments on commit eac8336

Please sign in to comment.