TeamCity.MSBuild.Logger/DefaultConsole.cs (36 lines of code) (raw):
namespace TeamCity.MSBuild.Logger
{
using System;
using System.IO;
using System.Threading;
using JetBrains.Annotations;
// ReSharper disable once ClassNeverInstantiated.Global
internal class DefaultConsole : IConsole, IInitializable
{
[NotNull] private readonly IDiagnostics _diagnostics;
[NotNull] private readonly TextWriter _out;
// ReSharper disable once IdentifierTypo
private int _reentrancy;
public DefaultConsole([NotNull] IDiagnostics diagnostics)
{
_diagnostics = diagnostics ?? throw new ArgumentNullException(nameof(diagnostics));
// https://youtrack.jetbrains.com/issue/TW-72330
_out = Console.Out;
}
public void Write(string text)
{
if (string.IsNullOrEmpty(text))
{
return;
}
// ReSharper disable once IdentifierTypo
var reentrancy = Interlocked.Increment(ref _reentrancy) - 1;
// ReSharper disable once AccessToModifiedClosure
_diagnostics.Send(() => $"[{reentrancy} +] Write({text.Trim()})");
try
{
_out.Write(text);
}
finally
{
reentrancy = Interlocked.Decrement(ref _reentrancy);
_diagnostics.Send(() => $"[{reentrancy} -] Write({text.Trim()})");
}
}
}
}