/// <summary> /// Initialize a new AggregateStackSource. /// </summary> /// <param name="sources">An IEnumerable of KeyValuePairs mapping source names to StackSources.</param> public AggregateStackSource(IEnumerable <KeyValuePair <string, StackSource> > sources) { m_sourceCount = sources.Count() + 1; // +1 for the pseudo-source. m_sourceNames = new string[m_sourceCount]; m_sources = new StackSource[m_sourceCount]; // We initialize this when we see the first sample m_firstSampleTime = new double[m_sourceCount]; for (int j = 0; j < m_firstSampleTime.Length; j++) { m_firstSampleTime[j] = double.NegativeInfinity; } // True if all sub-sources support retrieving samples by index. bool supportsSamples = true; // The time limit for this source. m_RelativeMSecLimit = 0.0f; int i = 1; // Unpack sources. foreach (var pair in sources) { var name = pair.Key; var source = pair.Value; m_sourceNames[i] = name; m_sources[i] = source; i++; m_RelativeMSecLimit = Math.Max(m_RelativeMSecLimit, source.SampleTimeRelativeMSecLimit); if (source.SampleIndexLimit == 0) { supportsSamples = false; } } // Set up pseudo-source. m_sources[0] = m_pseudo = new PseudoStackSource(m_sourceNames); // Set up our returned sample. m_sampleStorage = new StackSourceSample(this); // Set up index maps. m_stackMap = new IndexMap(m_sources.Select(s => s.CallStackIndexLimit)); m_frameMap = new IndexMap(m_sources.Select(s => s.CallFrameIndexLimit)); if (supportsSamples) { // The sampleMap has size (m_sourceCount - 1) because m_pseudo doesn't have samples. m_sampleMap = new IndexMap(m_sources.Skip(1).Select(s => s.SampleIndexLimit)); } else { m_sampleMap = null; } }