/// <summary> /// Given a Linux event gotten from the trace, make its corresponding sample for the stack source. /// </summary> public LinuxPerfScriptStackSourceSample CreateSampleFor(LinuxEvent linuxEvent, BlockedTimeAnalyzer blockedTimeAnalyzer) { IEnumerable <Frame> frames = linuxEvent.CallerStacks; StackSourceCallStackIndex stackIndex = currentStackIndex; var sample = new LinuxPerfScriptStackSourceSample(this); sample.TimeRelativeMSec = linuxEvent.TimeMSec - StartTimeStampMSec; sample.Metric = (float)linuxEvent.Period; sample.CpuNumber = linuxEvent.CpuNumber; stackIndex = InternFrames(frames.GetEnumerator(), stackIndex, linuxEvent.ProcessID, linuxEvent.ThreadID, doThreadTime ? blockedTimeAnalyzer : null); sample.StackIndex = stackIndex; return(sample); }
public void LinuxEventSampleAssociation(LinuxEvent linuxEvent, LinuxPerfScriptStackSourceSample sample) { LinuxEventSamples[linuxEvent] = sample; }
public void AddSample(LinuxPerfScriptStackSourceSample sample) { var baseSample = AddSample((StackSourceSample)sample); m_LinuxPerfScriptSamples.Add(new LinuxPerfScriptStackSourceSample(baseSample, sample.CpuNumber)); }
protected override void DoInterning() { int threadCount = MaxThreadCount; frames = new ConcurrentDictionary <string, StackSourceFrameIndex>(); parser.SkipPreamble(masterSource); Task[] tasks = new Task[threadCount]; List <BlockedTimeAnalyzer>[] threadBlockedTimeAnalyzers = null; if (doThreadTime) { threadBlockedTimeAnalyzers = new List <BlockedTimeAnalyzer> [tasks.Length]; } List <LinuxPerfScriptStackSourceSample>[] threadSamples = new List <LinuxPerfScriptStackSourceSample> [tasks.Length]; for (int i = 0; i < tasks.Length; i++) { threadSamples[i] = new List <LinuxPerfScriptStackSourceSample>(); if (threadBlockedTimeAnalyzers != null) { threadBlockedTimeAnalyzers[i] = new List <BlockedTimeAnalyzer>(); } var currentCulture = Thread.CurrentThread.CurrentCulture; var currentUICulture = Thread.CurrentThread.CurrentUICulture; tasks[i] = new Task((object givenArrayIndex) => { var oldCultures = Tuple.Create(Thread.CurrentThread.CurrentCulture, Thread.CurrentThread.CurrentUICulture); try { Thread.CurrentThread.CurrentCulture = currentCulture; Thread.CurrentThread.CurrentUICulture = currentUICulture; FastStream bufferPart; while ((bufferPart = GetNextSubStream(masterSource)) != null) { BlockedTimeAnalyzer blockedTimeAnalyzer = null; if (threadBlockedTimeAnalyzers != null) { blockedTimeAnalyzer = new BlockedTimeAnalyzer(this); threadBlockedTimeAnalyzers[(int)givenArrayIndex].Add(blockedTimeAnalyzer); } foreach (LinuxEvent linuxEvent in parser.Parse(bufferPart)) { // If doThreadTime is true this is running on a single thread. blockedTimeAnalyzer?.UpdateThreadState(linuxEvent); LinuxPerfScriptStackSourceSample sample = CreateSampleFor(linuxEvent, blockedTimeAnalyzer); if (linuxEvent.Kind == EventKind.Cpu) { threadSamples[(int)givenArrayIndex].Add(sample); } blockedTimeAnalyzer?.LinuxEventSampleAssociation(linuxEvent, sample); } bufferPart.Dispose(); } } finally { Thread.CurrentThread.CurrentCulture = oldCultures.Item1; Thread.CurrentThread.CurrentUICulture = oldCultures.Item2; } }, i); tasks[i].Start(); } Task.WaitAll(tasks); if (threadBlockedTimeAnalyzers != null) { List <BlockedTimeAnalyzer> allBlockedTimeAnalyzers = CustomExtensions.ConcatListsOfLists(threadBlockedTimeAnalyzers).ToList(); FixBlockedTimes(allBlockedTimeAnalyzers); foreach (var blockedTimeAnalyzer in allBlockedTimeAnalyzers) { TotalBlockedTime += blockedTimeAnalyzer.TotalBlockedTime; } } else { TotalBlockedTime = -1; } IEnumerable <LinuxPerfScriptStackSourceSample> allSamples = CustomExtensions.ConcatListsOfLists(threadSamples); AddSamples(allSamples); }