From d9866702681fa0f185be4ec38c203578bb15a6ef Mon Sep 17 00:00:00 2001 From: Samuele Lorefice Date: Thu, 27 Feb 2025 23:44:51 +0100 Subject: [PATCH] Added queue for log messages and logger on a separate thread, added telemetry. --- CodeGenerator/Program.cs | 70 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/CodeGenerator/Program.cs b/CodeGenerator/Program.cs index 8009b9c..8f6e3c1 100644 --- a/CodeGenerator/Program.cs +++ b/CodeGenerator/Program.cs @@ -1,10 +1,13 @@ using System; using System.CodeDom; using System.CodeDom.Compiler; +using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Text; +using System.Threading; using Kaitai; using Microsoft.CSharp; @@ -25,28 +28,81 @@ namespace CodeGenerator { private static readonly string[] ListMarkerStr = {"list", "array"}; private static readonly string[] ListLenghtStr = {"num", "len", "size"}; + private static ConcurrentQueue> _logQueue = new(); + enum LogType { + Info, + Warning, + Error + } - private static void Log(string message) { - Sb.AppendLine(message); - Console.WriteLine(message); + private static void LogNow(string message, LogType type = LogType.Info) { + string msg = $"{DateTime.Now:yy-MM-dd HH:mm:ss}|{type.ToString()}|{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) { - Log("Reading blend file"); - ReadBlendFile(); + 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"); + sw.Restart(); + ReadBlendFile(); + var readTime = sw.ElapsedTicks; + Log("Generating C# code..."); Log("Pass 1: Generating types"); + sw.Restart(); CodeNamespace ns = GenerateTypes(out var rootNs); + var genTime = sw.ElapsedTicks; + sw.Restart(); Log("Pass 2: Writing out code"); OutputCodeFiles(ns); OutputCodeFiles(rootNs, false); - + var writeTime = sw.ElapsedTicks; + sw.Stop(); + 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() {