Added queue for log messages and logger on a separate thread, added telemetry.

This commit is contained in:
Samuele Lorefice
2025-02-27 23:44:51 +01:00
parent 30cdc7a23d
commit d986670268

View File

@@ -1,10 +1,13 @@
using System; using System;
using System.CodeDom; using System.CodeDom;
using System.CodeDom.Compiler; using System.CodeDom.Compiler;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading;
using Kaitai; using Kaitai;
using Microsoft.CSharp; using Microsoft.CSharp;
@@ -25,28 +28,81 @@ namespace CodeGenerator {
private static readonly string[] ListMarkerStr = {"list", "array"}; private static readonly string[] ListMarkerStr = {"list", "array"};
private static readonly string[] ListLenghtStr = {"num", "len", "size"}; private static readonly string[] ListLenghtStr = {"num", "len", "size"};
private static ConcurrentQueue<Tuple<string, LogType>> _logQueue = new();
enum LogType {
Info,
Warning,
Error
}
private static void Log(string message) { private static void LogNow(string message, LogType type = LogType.Info) {
Sb.AppendLine(message); string msg = $"{DateTime.Now:yy-MM-dd HH:mm:ss}|{type.ToString()}|{message}";
Console.WriteLine(message); lock (Sb){ Sb.AppendLine(msg); }
Console.WriteLine(msg);
}
private static void Log(string message, LogType type = LogType.Info) {
_logQueue.Enqueue(new (message, type));
} }
public static void Main(string[] args) { public static void Main(string[] args) {
LogNow("Setting up logger...");
Stopwatch sw = new();
sw.Start();
long start = 0;
bool loggerExit = false;
Thread logger = new(() => {
start = sw.ElapsedTicks;
LogNow($"Logger started! In {sw.ElapsedMilliseconds}ms");
// ReSharper disable once AccessToModifiedClosure LoopVariableIsNeverChangedInsideLoop
while (!loggerExit || !_logQueue.IsEmpty)
if (_logQueue.TryDequeue(out var msg))
LogNow(msg.Item1, msg.Item2);
LogNow("Logger exiting...");
});
logger.Start();
var initTime = sw.ElapsedTicks;
Log("Reading blend file"); Log("Reading blend file");
sw.Restart();
ReadBlendFile(); ReadBlendFile();
var readTime = sw.ElapsedTicks;
Log("Generating C# code..."); Log("Generating C# code...");
Log("Pass 1: Generating types"); Log("Pass 1: Generating types");
sw.Restart();
CodeNamespace ns = GenerateTypes(out var rootNs); CodeNamespace ns = GenerateTypes(out var rootNs);
var genTime = sw.ElapsedTicks;
sw.Restart();
Log("Pass 2: Writing out code"); Log("Pass 2: Writing out code");
OutputCodeFiles(ns); OutputCodeFiles(ns);
OutputCodeFiles(rootNs, false); OutputCodeFiles(rootNs, false);
var writeTime = sw.ElapsedTicks;
sw.Stop();
Log("Finished generating C# code!"); Log("Finished generating C# code!");
File.AppendAllText("Log.txt", Sb.ToString()); Log($"""
Timings:
Initialization: {(decimal)initTime/ TimeSpan.TicksPerMillisecond,10:N4} ms
Logger Startup: {(decimal)start / TimeSpan.TicksPerMillisecond,10:N4} ms
Reading: {(decimal)readTime/ TimeSpan.TicksPerMillisecond,10:N4} ms
Generating: {(decimal)genTime/ TimeSpan.TicksPerMillisecond,10:N4} ms
Writing: {(decimal)writeTime/ TimeSpan.TicksPerMillisecond,10:N4} ms
----------------------------
Total: {(decimal)(initTime+readTime+genTime+writeTime) / TimeSpan.TicksPerMillisecond,10:N4} ms
""");
loggerExit = true;
while(logger.IsAlive) { }
Thread.Sleep(1000);
lock (Sb) {
File.AppendAllText("Log.txt", Sb.ToString());
}
} }
private static void ReadBlendFile() { private static void ReadBlendFile() {