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