From 9eb10fc9bd26031ce048103d17329e1f03ea0a13 Mon Sep 17 00:00:00 2001 From: maj00r Date: Tue, 3 Nov 2026 21:51:55 +0100 Subject: [PATCH] Let the signatures of saved trainsets go with their sceneries They were kept by the trainset's text for the whole session, behind one lock, and every reload added more. They are now kept as long as a trainset holds that text. --- .../Domain/Sceneries/SceneryTrainsetText.cs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/StarterNG/Domain/Sceneries/SceneryTrainsetText.cs b/StarterNG/Domain/Sceneries/SceneryTrainsetText.cs index aaadef6..b6bc8c3 100644 --- a/StarterNG/Domain/Sceneries/SceneryTrainsetText.cs +++ b/StarterNG/Domain/Sceneries/SceneryTrainsetText.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; using StarterNG.Classes; @@ -163,17 +164,14 @@ public static class SceneryTrainsetText public static bool IsModified(Trainset trainset) => trainset.Parsed && Signature(trainset) != SavedSignature(trainset.RawEntry); - private static readonly Dictionary SavedSignatures = new(); + /// + /// By the text a trainset holds, for as long as one holds it: a scenery read again + /// brings texts of its own, and those of the one it replaces go with it. + /// + private static readonly ConditionalWeakTable SavedSignatures = new(); - private static string SavedSignature(string raw) - { - lock (SavedSignatures) - { - if (!SavedSignatures.TryGetValue(raw, out string? signature)) - SavedSignatures[raw] = signature = Signature(new Trainset(raw)); - return signature; - } - } + private static string SavedSignature(string raw) => + SavedSignatures.GetValue(raw, text => Signature(new Trainset(text))); private static string Signature(Trainset trainset) => trainset.Velocity.ToString(CultureInfo.InvariantCulture) + "\n" +