private int origCol;
private int maxRow; // Running maximum of row number
private int maxCol; // Running maximum of col number
+ private int STATUS_ROW; // Row # of where we print the status of dotnet-counters
+ private bool paused = false;
private Dictionary<string, int> knownProvidersRowNum;
private Dictionary<string, int> unknownProvidersRowNum;
+ private void UpdateStatus(string msg)
+ {
+ Console.SetCursorPosition(0, STATUS_ROW);
+ Console.Write(new String(' ', 20));
+ Console.SetCursorPosition(0, STATUS_ROW);
+ Console.Write(msg);
+ }
+
public ConsoleWriter()
{
displayPosition = new Dictionary<string, (int, int)>();
origRow = Console.CursorTop;
origCol = Console.CursorLeft;
Console.WriteLine("Press p to pause, r to resume, q to quit.");
+ Console.WriteLine(" Status: Waiting for initial payload...");
- maxRow = origRow+1;
+ STATUS_ROW = origRow+1;
+ maxRow = origRow+2;
maxCol = origCol;
}
- public void Update(string providerName, ICounterPayload payload)
+ public void ToggleStatus(bool pauseCmdSet)
{
+ if (paused == pauseCmdSet)
+ {
+ return;
+ }
+ else if (pauseCmdSet)
+ {
+ UpdateStatus(" Status: Paused");
+ }
+ else
+ {
+ UpdateStatus(" Status: Running");
+ }
+ paused = pauseCmdSet;
+ }
+
+ public void Update(string providerName, ICounterPayload payload, bool pauseCmdSet)
+ {
+ if (paused != pauseCmdSet)
+ {
+ ToggleStatus(pauseCmdSet);
+ }
+
+ if (pauseCmdSet)
+ {
+ return;
+ }
+
string name = payload.GetName();
// We already know what this counter is! Just update the value string on the console.
}
}
}
-}
\ No newline at end of file
+}
// There's a potential race here between the two tasks but not a huge deal if we miss by one event.
if (pauseCmdSet)
{
- return;
+ writer.ToggleStatus(pauseCmdSet);
}
if (obj.EventName.Equals("EventCounters"))
{
payload = payloadFields.Count == 6 ? (ICounterPayload)new IncrementingCounterPayload(payloadFields) : (ICounterPayload)new CounterPayload(payloadFields);
}
- writer.Update(obj.ProviderName, payload);
+ writer.Update(obj.ProviderName, payload, pauseCmdSet);
}
}
var shouldExit = new ManualResetEvent(false);
var terminated = false;
+ writer.InitializeDisplay();
Task monitorTask = new Task(() => {
try
var binaryReader = EventPipeClient.CollectTracing(_processId, configuration, out _sessionId);
EventPipeEventSource source = new EventPipeEventSource(binaryReader);
- writer.InitializeDisplay();
source.Dynamic.All += Dynamic_All;
source.Process();
}