Added queue for log messages and logger on a separate thread, added telemetry.
This commit is contained in:
@@ -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<Tuple<string, LogType>> _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) {
|
||||
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() {
|
||||
|
||||
Reference in New Issue
Block a user