예제 #1
0
        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();
                }
            }
        }
예제 #2
0
        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);
        }