From ce9db9badaa74841e7922582716993aaae42824d Mon Sep 17 00:00:00 2001 From: StephenCWills Date: Tue, 21 Jan 2025 16:39:12 -0500 Subject: [PATCH 1/3] GSF.TimeSeries: Eliminate queue of input measurement keys --- .../IndependentActionAdapterManagerBase.cs | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs b/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs index e4f16d4a04..02750e78cd 100644 --- a/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs +++ b/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs @@ -80,7 +80,7 @@ namespace GSF.TimeSeries.Adapters // Fields private readonly LongSynchronizedOperation m_parseConnectionString; private readonly LongSynchronizedOperation m_initializeChildAdapters; - private readonly List m_inputMeasurementKeysQueue; + private MeasurementKey[] m_inputMeasurementKeysForInitialization; private bool m_disposed; #endregion @@ -104,8 +104,6 @@ protected IndependentActionAdapterManagerBase() { IsBackground = true }; - - m_inputMeasurementKeysQueue = new List(2); } #endregion @@ -458,32 +456,21 @@ protected override void Dispose(bool disposing) /// protected virtual void InitializeChildAdapterManagement(MeasurementKey[] inputMeasurementKeys) { - lock (m_inputMeasurementKeysQueue) - { - if (m_inputMeasurementKeysQueue.Count < 2) - m_inputMeasurementKeysQueue.Add(inputMeasurementKeys); - else - m_inputMeasurementKeysQueue[1] = inputMeasurementKeys; - - m_initializeChildAdapters.RunOnceAsync(); - } + Interlocked.Exchange(ref m_inputMeasurementKeysForInitialization, inputMeasurementKeys); + m_initializeChildAdapters.RunOnceAsync(); } private void InitializeChildAdapters() { - MeasurementKey[] inputMeasurementKeys; - - lock (m_inputMeasurementKeysQueue) + try { - if (m_inputMeasurementKeysQueue.Count == 0) - return; + MeasurementKey[] inputMeasurementKeys = Interlocked.Exchange(ref m_inputMeasurementKeysForInitialization, null); - inputMeasurementKeys = m_inputMeasurementKeysQueue[0]; - m_inputMeasurementKeysQueue.RemoveAt(0); - } + // Indicates an extremely unlikely race condition occurred, + // but this is expected so don't issue a warning + if (inputMeasurementKeys is null) + return; - try - { // If no inputs are defined, skip setup if (inputMeasurementKeys.Length == 0) { From 681d76727b38a99bcf1d03d9ee5a0d4f29614c80 Mon Sep 17 00:00:00 2001 From: StephenCWills Date: Tue, 21 Jan 2025 16:39:42 -0500 Subject: [PATCH 2/3] GSF.TimeSeries: Filter inactive measurements out of input measurement keys --- .../Adapters/IndependentActionAdapterManagerBase.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs b/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs index 02750e78cd..137bb2b86c 100644 --- a/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs +++ b/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs @@ -640,6 +640,10 @@ public virtual void ParseConnectionString() { this.HandleParseConnectionString(); + InputMeasurementKeys = InputMeasurementKeys + .Where(key => this.SignalIDExists(key.SignalID)) + .ToArray(); + if (FramesPerSecond < 1) FramesPerSecond = DefaultFramesPerSecond; From 5a481ed928643723aaa35ecf9bca96ef52eb4630 Mon Sep 17 00:00:00 2001 From: StephenCWills Date: Tue, 21 Jan 2025 16:41:51 -0500 Subject: [PATCH 3/3] GSF.TimeSeries: Track adapter index during initialization --- .../Adapters/IndependentActionAdapterManagerBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs b/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs index 137bb2b86c..b13cf28f2c 100644 --- a/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs +++ b/Source/Libraries/GSF.TimeSeries/Adapters/IndependentActionAdapterManagerBase.cs @@ -531,9 +531,9 @@ private void InitializeChildAdapters() } // Create child adapter for provided inputs to the parent bulk collection-based adapter - for (int i = 0; i < inputMeasurementKeys.Length; i += inputsPerAdapter) + for (int i = 0, adapterIndex = 0; i < inputMeasurementKeys.Length; i += inputsPerAdapter, adapterIndex++) { - CurrentAdapterIndex = adapters.Count; + CurrentAdapterIndex = adapterIndex; inputsPerAdapter = PerAdapterInputCount; Guid[] inputs = new Guid[inputsPerAdapter];