Skip to content

Commit

Permalink
Merge pull request #356 from GridProtectionAlliance/adapter-manager-f…
Browse files Browse the repository at this point in the history
…ixes

GSF-12 IndependentActionAdapterManagerBase fixes
  • Loading branch information
ritchiecarroll authored Jan 21, 2025
2 parents a56b244 + 5a481ed commit b1c20b7
Showing 1 changed file with 15 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ namespace GSF.TimeSeries.Adapters
// Fields
private readonly LongSynchronizedOperation m_parseConnectionString;
private readonly LongSynchronizedOperation m_initializeChildAdapters;
private readonly List<MeasurementKey[]> m_inputMeasurementKeysQueue;
private MeasurementKey[] m_inputMeasurementKeysForInitialization;
private bool m_disposed;

#endregion
Expand All @@ -104,8 +104,6 @@ protected IndependentActionAdapterManagerBase()
{
IsBackground = true
};

m_inputMeasurementKeysQueue = new List<MeasurementKey[]>(2);
}

#endregion
Expand Down Expand Up @@ -458,32 +456,21 @@ protected override void Dispose(bool disposing)
/// </remarks>
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)
{
Expand Down Expand Up @@ -544,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];
Expand Down Expand Up @@ -653,6 +640,10 @@ public virtual void ParseConnectionString()
{
this.HandleParseConnectionString();

InputMeasurementKeys = InputMeasurementKeys
.Where(key => this.SignalIDExists(key.SignalID))
.ToArray();

if (FramesPerSecond < 1)
FramesPerSecond = DefaultFramesPerSecond;

Expand Down

0 comments on commit b1c20b7

Please sign in to comment.