Example #1
0
        int ThreadNameSorter(EventsThreadRow a, EventsThreadRow b)
        {
            if (a.Description.ThreadID == ThreadDescription.InvalidThreadID && b.Description.ThreadID != ThreadDescription.InvalidThreadID)
            {
                return(-1);
            }

            if (a.Description.ThreadID != ThreadDescription.InvalidThreadID && b.Description.ThreadID == ThreadDescription.InvalidThreadID)
            {
                return(1);
            }

            int nameCompare = a.Name.CompareTo(b.Name);

            return(nameCompare != 0 ? nameCompare : a.Description.ThreadID.CompareTo(b.Description.ThreadID));
        }
Example #2
0
            public bool IsMatch(EventsThreadRow thread)
            {
                // Max distance between thread names
                int maxLevensteinDistance = thread.Description.Name.Length / 3;

                foreach (EventsThreadRow candidate in Threads)
                {
                    if (candidate.Description.Mask == thread.Description.Mask && candidate.Description.Origin == thread.Description.Origin)
                    {
                        if (Utils.ComputeLevenshteinDistance(candidate.Description.Name, thread.Description.Name) < maxLevensteinDistance)
                        {
                            return(true);
                        }
                    }
                }
                return(false);
            }
        void InitThreadList(SamplingFrame frame)
        {
            Frame = frame;

            List <ThreadRow> rows = new List <ThreadRow>();

            if (frame != null)
            {
                List <Entry> entries = new List <Entry>();

                SamplingNode root = frame.Root;

                BuildEntryList(entries, root, 0.0);

                EventFrame eventFrame = new EventFrame(new FrameHeader()
                {
                    Start = 0, Finish = Durable.MsToTick(root.Duration)
                }, entries, frame.Group);
                ThreadData threadData = new ThreadData(null)
                {
                    Events = new List <EventFrame> {
                        eventFrame
                    }
                };
                EventsThreadRow row = new EventsThreadRow(frame.Group, new ThreadDescription()
                {
                    Name = "Sampling Node"
                }, threadData, Settings);
                row.LimitMaxDepth   = false;
                row.EventNodeHover += Row_EventNodeHover;
                rows.Add(row);
                ThreadViewControl.Scroll.ViewUnit.Width = 1.0;
                ThreadViewControl.InitRows(rows, eventFrame.Header);
            }
            else
            {
                ThreadViewControl.InitRows(rows, null);
            }
        }
Example #4
0
        List <EventsThreadRow> GenerateThreadRows(FrameGroup group)
        {
            id2row.Clear();

            List <EventsThreadRow> eventThreads = new List <EventsThreadRow>();

            for (int i = 0; i < Math.Min(group.Board.Threads.Count, group.Threads.Count); ++i)
            {
                ThreadData        data   = group.Threads[i];
                ThreadDescription thread = data.Description;

                if (thread.IsIdle)
                {
                    continue;
                }

                bool threadHasData = false;
                if (data.Events != null)
                {
                    double duration = 0.0;
                    foreach (EventFrame frame in data.Events)
                    {
                        duration += frame.Duration;
                        if (duration > MIN_THREAD_ACCUMULATED_DURATION)
                        {
                            threadHasData = true;
                            break;
                        }
                    }
                }

                if (thread.Origin == ThreadDescription.Source.Core)
                {
                    threadHasData = true;
                }

                if (threadHasData)
                {
                    EventsThreadRow row = new EventsThreadRow(group, thread, data, Settings);
                    eventThreads.Add(row);

                    id2row.Add(row.Description.ThreadIndex, row);
                    row.EventNodeHover    += Row_EventNodeHover;
                    row.EventNodeSelected += Row_EventNodeSelected;
                }

                if (GenerateSamplingThreads && data.Callstacks != null && data.Callstacks.Count > 3)
                {
                    ThreadData      samplingData = GenerateSamplingThread(group, data);
                    EventsThreadRow row          = new EventsThreadRow(group, new ThreadDescription()
                    {
                        Name = thread.Name + " [Sampling]", Origin = ThreadDescription.Source.Sampling
                    }, samplingData, Settings);
                    eventThreads.Add(row);
                    row.EventNodeHover    += Row_EventNodeHover;
                    row.EventNodeSelected += Row_EventNodeSelected;
                }
            }

            return(SortRows(eventThreads));
        }