internal void ProcessInput() { // 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. string line = process.StandardOutput.ReadLine(); if (!string.IsNullOrEmpty(line)) // Skip bad data. { 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); } } } }
internal void ProcessInput() { string line; while ((line = process.StandardOutput.ReadLine()) != null) { logger.WriteLine(LogKind.Default, line); if (string.IsNullOrEmpty(line)) { continue; } 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); } } }
internal void ProcessInput() { string line; while ((line = process.StandardOutput.ReadLine()) != null) { logger.WriteLine(LogKind.Default, line); if (string.IsNullOrEmpty(line)) { continue; } if (!line.StartsWith("//")) { LinesWithResults.Add(line); } else if (line == Engine.Signals.BeforeAnythingElse) { diagnoser?.BeforeAnythingElse(process, benchmark); } else if (line == Engine.Signals.AfterSetup) { diagnoser?.AfterSetup(process, benchmark); } else if (line == Engine.Signals.BeforeCleanup) { diagnoser?.BeforeCleanup(); } else { LinesWithExtraOutput.Add(line); } } }
internal void ProcessInput() { string line; while ((line = process.StandardOutput.ReadLine()) != null) { logger.WriteLine(LogKind.Default, line); if (string.IsNullOrEmpty(line)) { continue; } if (!line.StartsWith("//")) { LinesWithResults.Add(line); } else if (line == Engine.Signals.BeforeAnythingElse) { diagnoser?.BeforeAnythingElse(diagnoserActionParameters); } else if (line == Engine.Signals.AfterGlobalSetup) { diagnoser?.AfterGlobalSetup(diagnoserActionParameters); } else if (line == Engine.Signals.BeforeMainRun) { diagnoser?.BeforeMainRun(diagnoserActionParameters); } else if (line == Engine.Signals.BeforeGlobalCleanup) { diagnoser?.BeforeGlobalCleanup(); } else if (line == Engine.Signals.AfterAnythingElse) { // TODO: notify AfterAnythingElse } else { LinesWithExtraOutput.Add(line); } } }
internal void ProcessInput() { // 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. string line = process.StandardOutput.ReadLine(); if (line == null) { continue; } logger.WriteLine(LogKind.Default, line); if (!line.StartsWith("//")) { LinesWithResults.Add(line); } else if (Engine.Signals.TryGetSignal(line, out var signal)) { diagnoser?.Handle(signal, diagnoserActionParameters); if (process.StartInfo.RedirectStandardInput) { process.StandardInput.WriteLine(Engine.Signals.Acknowledgment); } if (signal == HostSignal.AfterAll) { // we have received the last signal so we can stop reading the output // if the process won't exit after this, its hung and needs to be killed return; } } else if (!string.IsNullOrEmpty(line)) { LinesWithExtraOutput.Add(line); } } }
internal void ProcessInput() { string line; while ((line = process.StandardOutput.ReadLine()) != null) { logger.WriteLine(LogKind.Default, line); if (!string.IsNullOrEmpty(line)) { if (!line.StartsWith("//")) { LinesWithResults.Add(line); } else { LinesWithExtraOutput.Add(line); } } // This is important so the Diagnoser can know the [Benchmark] methods will have run and (e.g.) it can do a Memory Dump if (diagnosticsAlreadyRun || !line.StartsWith(IterationMode.MainWarmup.ToString())) { continue; } try { diagnoser?.AfterBenchmarkHasRun(benchmark, process); } finally { // Always set this, even if something went wrong, otherwise we will try on every run of a benchmark batch diagnosticsAlreadyRun = true; } } }