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)); }
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); } }
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)); }