History

Migrated changes from VS2010: 1) GSF.Core: Updated process queue to be based on IProducerConsumerCollection<T> model using a lock-free concurrent queue for common default operations. 2) GSF.Core: Optimized implementation of MultiSourceFrameImageParserBase using concurrent dictionaries. 3) GSF.Core: Added an AddRange method to ProcessQueue base implementation. 4) GSF.TimeSeries: Updated OutputAdapterBase to better take advantage of new ProcessQueue functionality. 5) GSF.Historian: Updated openHistorian 1.0 code to accomodate updates to ProcessQueue.

StephenCWills committed 14 years ago

Commit ae78d0f1 parent cafd09910 files · +2658 −1805Browse files

Showing the changes to Source/Libraries/GSF.Core/Parsing/MultiSourceFrameImageParserBase.cs (1 of 10 files). Show all

Unified · Split

Source/Libraries/GSF.Core/Parsing/MultiSourceFrameImageParserBase.cs+23−38
@@ -17,6 +17,8 @@ · 16 unmodified lines
1717 // Edited Comments.
1818 // 09/14/2009 - Stephen C. Wills
1919 // Added new header and license agreement.
20+// 11/01/2012 - J. Ritchie Carroll
21+// Updated to use concurrent dictionaries and new recreate parsed output list.
2022 //
2123 //*******************************************************************************************************
2224
@@ -259,6 +261,7 @@ · 236 unmodified lines
259261
260262 using GSF.Collections;
261263 using System;
264+using System.Collections.Concurrent;
262265 using System.Collections.Generic;
263266 using System.ComponentModel;
264267 using System.Text;
@@ -303,9 +306,9 @@ namespace GSF.Parsing · 38 unmodified lines
303306
304307 // Fields
305308 private ProcessQueue<IdentifiableItem<TSourceIdentifier, byte[]>> m_bufferQueue;
306− private Dictionary<TSourceIdentifier, bool> m_sourceInitialized;
307− private Dictionary<TSourceIdentifier, byte[]> m_unparsedBuffers;
308− private List<TOutputType> m_parsedOutputs;
309+ private ConcurrentDictionary<TSourceIdentifier, bool> m_sourceInitialized;
310+ private ConcurrentDictionary<TSourceIdentifier, byte[]> m_unparsedBuffers;
311+ private readonly List<TOutputType> m_parsedOutputs;
309312 private TSourceIdentifier m_sourceID;
310313 private bool m_disposed;
311314
@@ -322,13 +325,14 @@ namespace GSF.Parsing · 10 unmodified lines
322325 m_bufferQueue.ProcessException += ProcessExceptionHandler;
323326
324327 if (ProtocolUsesSyncBytes)
325− m_sourceInitialized = new Dictionary<TSourceIdentifier, bool>();
328+ m_sourceInitialized = new ConcurrentDictionary<TSourceIdentifier, bool>();
326329
327− m_unparsedBuffers = new Dictionary<TSourceIdentifier, byte[]>();
330+ m_unparsedBuffers = new ConcurrentDictionary<TSourceIdentifier, byte[]>();
331+ m_parsedOutputs = new List<TOutputType>();
328332
329333 // We attach to base class events so we can cumulate outputs per data source and handle data errors
330− base.DataParsed += CumulateParsedOutput;
331− base.DataDiscarded += ResetDataSourceInitialization;
334+ base.DataParsed += DataParsed_CumulateParsedOutput;
335+ base.DataDiscarded += DataDiscarded_ResetDataSourceInitialization;
332336 }
333337
334338 #endregion
@@ -399,21 +403,12 @@ namespace GSF.Parsing · 64 unmodified lines
399403 }
400404 m_bufferQueue = null;
401405
402− if ((object)m_sourceInitialized != null)
403− {
404− m_sourceInitialized.Clear();
405− }
406406 m_sourceInitialized = null;
407−
408− if ((object)m_unparsedBuffers != null)
409− {
410− m_unparsedBuffers.Clear();
411− }
412407 m_unparsedBuffers = null;
413408
414409 // Detach from base class events
415− base.DataParsed -= CumulateParsedOutput;
416− base.DataDiscarded -= ResetDataSourceInitialization;
410+ base.DataParsed -= DataParsed_CumulateParsedOutput;
411+ base.DataDiscarded -= DataDiscarded_ResetDataSourceInitialization;
417412 }
418413 }
419414 finally
@@ -491,11 +486,8 @@ namespace GSF.Parsing · 71 unmodified lines
491486 /// </remarks>
492487 public virtual void PurgeBuffer(TSourceIdentifier source)
493488 {
494− lock (m_unparsedBuffers)
495− {
496− if (m_unparsedBuffers.ContainsKey(source))
497− m_unparsedBuffers.Remove(source);
498− }
489+ byte[] buffer;
490+ m_unparsedBuffers.TryRemove(source, out buffer);
499491 }
500492
501493 /// <summary>
@@ -586,27 +578,20 @@ namespace GSF.Parsing · 84 unmodified lines
586578 buffer = item.Item;
587579
588580 // Check to see if this data source has been initialized
589− if ((object)m_sourceInitialized != null && !m_sourceInitialized.TryGetValue(m_sourceID, out StreamInitialized))
590− m_sourceInitialized.Add(m_sourceID, true);
581+ if ((object)m_sourceInitialized != null)
582+ StreamInitialized = m_sourceInitialized.GetOrAdd(m_sourceID, true);
591583
592584 // Restore any unparsed buffers for this data source, if any
593− lock (m_unparsedBuffers)
594− {
595− if (!m_unparsedBuffers.TryGetValue(m_sourceID, out UnparsedBuffer))
596− m_unparsedBuffers.Add(m_sourceID, null);
597− }
585+ UnparsedBuffer = m_unparsedBuffers.GetOrAdd(m_sourceID, (byte[])null);
598586
599− // Create new collection for parsed output
600− m_parsedOutputs = new List<TOutputType>();
587+ // Clear collection to hold new parsed output
588+ m_parsedOutputs.Clear();
601589
602590 // Start parsing sequence for this buffer - this will cumulate new parsed outputs
603591 base.Write(buffer, 0, buffer.Length);
604592
605593 // Track last unparsed buffer for this data source
606− lock (m_unparsedBuffers)
607− {
608− m_unparsedBuffers[m_sourceID] = UnparsedBuffer;
609− }
594+ m_unparsedBuffers[m_sourceID] = UnparsedBuffer;
610595
611596 // Expose any parsed data
612597 if (m_parsedOutputs.Count > 0)
@@ -626,13 +611,13 @@ namespace GSF.Parsing · 13 unmodified lines
626611 }
627612
628613 // Cumulate output data for current data source
629− private void CumulateParsedOutput(object sender, EventArgs<TOutputType> data)
614+ private void DataParsed_CumulateParsedOutput(object sender, EventArgs<TOutputType> data)
630615 {
631616 m_parsedOutputs.Add(data.Argument);
632617 }
633618
634619 // If an error occurs during parsing from a data source, we reset its initialization state
635− private void ResetDataSourceInitialization(object sender, EventArgs<byte[]> data)
620+ private void DataDiscarded_ResetDataSourceInitialization(object sender, EventArgs<byte[]> data)
636621 {
637622 if ((object)m_sourceInitialized != null)
638623 m_sourceInitialized[m_sourceID] = false;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t