Skip to content
Closed
4 changes: 2 additions & 2 deletions src/Particular.PlatformSample/AppLauncher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ sealed class AppLauncher(bool showPlatformToolConsoleOutput) : IAsyncDisposable
readonly Stack<Func<ValueTask>> cleanupActions = new();
readonly List<PlatformTool> platformTools = [];

public sealed record PlatformTool(string Name, Process Process, StringBuilder ErrorOutput);
public sealed record PlatformTool(string Name, Process Process, BoundedOutput ErrorOutput);

public void StopProcesses()
{
Expand Down Expand Up @@ -215,7 +215,7 @@ void StartProcess(string name, string assemblyPath, Dictionary<string, string> e
}

var process = Process.Start(startInfo);
var tool = new PlatformTool(name, process, new StringBuilder());
var tool = new PlatformTool(name, process, new BoundedOutput());

// without this in certain occasions the start takes waaaaay longer!
if (hideConsoleOutput)
Expand Down
46 changes: 46 additions & 0 deletions src/Particular.PlatformSample/BoundedOutput.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
namespace Particular
{
using System;
using System.Text;

sealed class BoundedOutput
{
const int MaximumLength = 8192;
readonly StringBuilder output = new(MaximumLength);

public void AppendLine(string line)
{
lock (output)
{
Append(line.AsSpan());
Append(Environment.NewLine.AsSpan());
}
}

void Append(ReadOnlySpan<char> text)
{
if (text.Length >= MaximumLength)
{
output.Clear();
output.Append(text[^MaximumLength..]);
return;
}

var excess = output.Length + text.Length - MaximumLength;
if (excess > 0)
{
output.Remove(0, excess);
}

output.Append(text);
}

public override string ToString()
{
lock (output)
{
return output.ToString();
}
}
}
}
Loading