public void ParseSample(Messages.Sample sample) { lock (m_lock) { //Update calls Increment(sample.ThreadId, sample.Functions[0], 0, m_calls, sample.Time); for (int f = 1; f < sample.Functions.Count; ++f) { Increment(sample.ThreadId, sample.Functions[f], sample.Functions[f - 1], m_calls, sample.Time); } Increment(sample.ThreadId, 0, sample.Functions[sample.Functions.Count - 1], m_calls, sample.Time); //Update overall samples count for (int s = 0; s < sample.Functions.Count; ++s) { int functionId = sample.Functions[s]; bool first = true; //scan backwards to see if this was elsewhere in the stack and therefore already counted for (int r = s - 1; r >= 0; --r) { if (functionId == sample.Functions[r]) { //yep, it was first = false; break; } } if (first) { long key = Sample.ComputeKey(sample.ThreadId, functionId); //add the function if we don't have it yet if (!m_samples.ContainsKey(key)) { m_samples.Add(key, new Sample { ThreadId = sample.ThreadId, FunctionId = functionId, Time = sample.Time }); } else { m_samples[key].Time += sample.Time; } } } ++m_cachedSamples; if (m_cachedSamples > 2000 || ShouldFlush) { Flush(); } } }
private void ParseSample(Messages.Sample sample) { if (!m_threads.ContainsKey(sample.ThreadId)) { ThreadContext info = new ThreadContext(sample.ThreadId, "", true); m_threads.Add(sample.ThreadId, info); RequestThreadMapping(sample.ThreadId); } foreach (var id in sample.Functions) { if (!m_functions.ContainsKey(id)) { RequestFunctionMapping(id); } } m_data.ParseSample(sample); }