From de70740e3b4f62e2e2778c91bcfd85d93c3b73a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:14:43 +0000 Subject: [PATCH 1/2] Initial plan From 6b58dbd7d61c1263b6ead1bdca5da41c0e25d253 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:18:12 +0000 Subject: [PATCH 2/2] Fix thread-safety issue in GetRouteToSource - snapshot TieLineCollection before enumeration Co-authored-by: ngenovese11 <23391587+ngenovese11@users.noreply.github.com> --- src/PepperDash.Essentials.Core/Routing/Extensions.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/PepperDash.Essentials.Core/Routing/Extensions.cs b/src/PepperDash.Essentials.Core/Routing/Extensions.cs index 3797f5e20..8c6fc6236 100644 --- a/src/PepperDash.Essentials.Core/Routing/Extensions.cs +++ b/src/PepperDash.Essentials.Core/Routing/Extensions.cs @@ -339,17 +339,21 @@ private static bool GetRouteToSource(this IRoutingInputs destination, IRoutingOu RoutingInputPort goodInputPort = null; + // Take a snapshot to avoid InvalidOperationException if TieLineCollection.Default is + // modified concurrently (e.g. NVX tie line registration during route requests). + var tieLines = TieLineCollection.Default.ToList(); + IEnumerable destinationTieLines; TieLine directTie = null; if (destinationPort == null) { - destinationTieLines = TieLineCollection.Default.Where(t => + destinationTieLines = tieLines.Where(t => t.DestinationPort.ParentDevice.Key == destination.Key && (t.Type.HasFlag(signalType) || signalType == eRoutingSignalType.AudioVideo)); } else { - destinationTieLines = TieLineCollection.Default.Where(t => t.DestinationPort.ParentDevice.Key == destination.Key && t.DestinationPort.Key == destinationPort.Key && (t.Type.HasFlag(signalType))); + destinationTieLines = tieLines.Where(t => t.DestinationPort.ParentDevice.Key == destination.Key && t.DestinationPort.Key == destinationPort.Key && (t.Type.HasFlag(signalType))); } // find the TieLine without a port