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;
|
||||||
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) {
|
||||||
Log("Reading blend file");
|
LogNow("Setting up logger...");
|
||||||
ReadBlendFile();
|
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("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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user