Move caret back to the end when exiting (#1838)
authorKevin Gosse <krix33@gmail.com>
Fri, 18 Dec 2020 00:05:59 +0000 (01:05 +0100)
committerGitHub <noreply@github.com>
Fri, 18 Dec 2020 00:05:59 +0000 (16:05 -0800)
* Move caret back to the end when exiting

* Compute maxRow during AssignRowsAndInitializeDisplay

* Address PR feedback

src/Tools/dotnet-counters/Exporters/ConsoleWriter.cs

index 16bdb0d867559bf97b84b3ba9e3321d38f62e9df..e5c0cd6bce5cc826bcb2ddac13f475571c4c5699 100644 (file)
@@ -37,6 +37,7 @@ namespace Microsoft.Diagnostics.Tools.Counters.Exporters
             public int Row { get; set; } // Assigned row for this counter. May change during operation.
         }
 
+        private readonly object _lock = new object();
         private readonly Dictionary<string, ObservedProvider> providers = new Dictionary<string, ObservedProvider>(); // Tracks observed providers and counters.
         private const int Indent = 4; // Counter name indent size.
         private int maxNameLength = 40; // Allow room for 40 character counter names by default.
@@ -46,6 +47,8 @@ namespace Microsoft.Diagnostics.Tools.Counters.Exporters
         private bool paused = false;
         private bool initialized = false;
 
+        private int maxRow = -1;
+
         public void Initialize()
         {
             AssignRowsAndInitializeDisplay();
@@ -82,6 +85,8 @@ namespace Microsoft.Diagnostics.Tools.Counters.Exporters
                     counter.Row = row++;
                 }
             }
+
+            maxRow = Math.Max(maxRow, row);
         }
 
         public void ToggleStatus(bool pauseCmdSet)
@@ -97,62 +102,77 @@ namespace Microsoft.Diagnostics.Tools.Counters.Exporters
 
         public void CounterPayloadReceived(string providerName, ICounterPayload payload, bool pauseCmdSet)
         {
-            if (!initialized)
+            lock (_lock)
             {
-                initialized = true;
-                AssignRowsAndInitializeDisplay();
-            }
+                if (!initialized)
+                {
+                    initialized = true;
+                    AssignRowsAndInitializeDisplay();
+                }
 
-            if (pauseCmdSet)
-            {
-                return;
-            }
+                if (pauseCmdSet)
+                {
+                    return;
+                }
 
-            string name = payload.GetName();
+                string name = payload.GetName();
 
-            bool redraw = false;
-            if (!providers.TryGetValue(providerName, out ObservedProvider provider))
-            {
-                providers[providerName] = provider = new ObservedProvider(providerName);
-                redraw = true;
-            }
+                bool redraw = false;
+                if (!providers.TryGetValue(providerName, out ObservedProvider provider))
+                {
+                    providers[providerName] = provider = new ObservedProvider(providerName);
+                    redraw = true;
+                }
 
-            if (!provider.Counters.TryGetValue(name, out ObservedCounter counter))
-            {
-                string displayName = payload.GetDisplay();
-                provider.Counters[name] = counter = new ObservedCounter(displayName);
-                maxNameLength = Math.Max(maxNameLength, displayName.Length);
-                redraw = true;
-            }
+                if (!provider.Counters.TryGetValue(name, out ObservedCounter counter))
+                {
+                    string displayName = payload.GetDisplay();
+                    provider.Counters[name] = counter = new ObservedCounter(displayName);
+                    maxNameLength = Math.Max(maxNameLength, displayName.Length);
+                    redraw = true;
+                }
 
-            const string DecimalPlaces = "###";
-            string payloadVal = payload.GetValue().ToString("#,0." + DecimalPlaces, CultureInfo.CurrentCulture);
-            int decimalIndex = payloadVal.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.CurrentCulture);
-            if (decimalIndex == -1)
-            {
-                decimalIndex = payloadVal.Length;
-            }
+                const string DecimalPlaces = "###";
+                string payloadVal = payload.GetValue().ToString("#,0." + DecimalPlaces, CultureInfo.CurrentCulture);
+                int decimalIndex = payloadVal.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.CurrentCulture);
+                if (decimalIndex == -1)
+                {
+                    decimalIndex = payloadVal.Length;
+                }
 
-            if (decimalIndex > maxPreDecimalDigits)
-            {
-                maxPreDecimalDigits = decimalIndex;
-                redraw = true;
-            }
+                if (decimalIndex > maxPreDecimalDigits)
+                {
+                    maxPreDecimalDigits = decimalIndex;
+                    redraw = true;
+                }
 
-            if (redraw)
-            {
-                AssignRowsAndInitializeDisplay();
-            }
+                if (redraw)
+                {
+                    AssignRowsAndInitializeDisplay();
+                }
 
-            Console.SetCursorPosition(Indent + maxNameLength + 1, counter.Row);
-            int prefixSpaces = maxPreDecimalDigits - decimalIndex;
-            int postfixSpaces = DecimalPlaces.Length - (payloadVal.Length - decimalIndex - 1);
-            Console.Write($"{new string(' ', prefixSpaces)}{payloadVal}{new string(' ', postfixSpaces)}");
+                Console.SetCursorPosition(Indent + maxNameLength + 1, counter.Row);
+                int prefixSpaces = maxPreDecimalDigits - decimalIndex;
+                int postfixSpaces = DecimalPlaces.Length - (payloadVal.Length - decimalIndex - 1);
+                Console.Write($"{new string(' ', prefixSpaces)}{payloadVal}{new string(' ', postfixSpaces)}");
+            }
         }
 
         public void Stop()
         {
-            // Nothing to do here.
+            lock (_lock)
+            {
+                if (initialized)
+                {
+                    var row = maxRow;
+
+                    if (row > -1)
+                    {
+                        Console.SetCursorPosition(0, row);
+                        Console.WriteLine();
+                    }
+                }
+            }
         }
     }
 }