private void Flush(TimingThread thread, TimingEntry[] entries, int count)
        {
            var span = entries.AsSpan(0, count);

            lock (m_seen)
            {
                if (m_seen.Contains(thread) == false)
                {
                    // output thread name to chrome trace
                    // we can affort to do this inefficiently since it's only done once per thread
                    m_writer?.WriteLine(", { \"name\": \"thread_name\", \"ph\": \"M\", \"pid\": 0, \"tid\": " + thread.Index.ToString() + ", \"args\": { \"name\": \"" + thread.Name + "\" } }");
                    m_seen.Add(thread);
                }
            }

            // some acrobatics here to avoid string allocations

            // assume thread name < 64 chars
            Span <char> buffer = stackalloc char[64 + 5 + k_part0.Length + k_part1.Length + k_part2.Length];

            k_part0.AsSpan().CopyTo(buffer);
            var work = buffer.Slice(k_part0.Length);

            var invFrequencyToMicros = m_invFrequencyToMicros;
            var ti = thread.Index;

            for (int i = 0; i < span.Length; i++)
            {
                ref readonly var entry = ref span[i];
Exemplo n.º 2
0
        private void Flush(TimingThread thread, TimingEntry[] entries, int count)
        {
            var span = entries.AsSpan(0, count);

            var writer = m_writer;

            if (writer == null)
            {
                return;
            }

            lock (m_seen)
            {
                if (m_seen.Contains(thread) == false)
                {
                    // output thread name to chrome trace
                    // we can affort to do this inefficiently since it's only done once per thread
                    writer.WriteLine(", { \"name\": \"thread_name\", \"ph\": \"M\", \"pid\": 0, \"tid\": " + thread.Index.ToString() + ", \"args\": { \"name\": \"" + thread.Name + "\" } }");
                    m_seen.Add(thread);
                }
            }

            var invFrequencyToMicros = m_invFrequencyToMicros;
            var ti = thread.Index;

            Span <char> buf = stackalloc char[256];
            var         bdr = new FixedStringBuilder(buf);

            bdr.Append(k_namePart);
            for (int i = 0; i < span.Length; i++)
            {
                bdr.Length = k_namePart.Length;                 // keep name part only

                ref readonly var entry = ref span[i];
Exemplo n.º 3
0
 internal static void Flush(TimingThread thread, TimingEntry[] items, int count)
 {
     foreach (var listener in s_listeners.ReadOnlySpan)
     {
         lock (listener)
             listener(thread, items, count);
     }
 }
Exemplo n.º 4
0
        private static TimingThread CreateNewTimingThread()
        {
            var instance = new TimingThread();
            int index    = TimingService.RegisterThread(instance);

            instance.Init(index);
            return(instance);
        }
Exemplo n.º 5
0
 public static int RegisterThread(TimingThread thread)
 {
     lock (s_threads)
     {
         var retval = s_threads.Count;
         s_threads.Add(thread);
         return(retval);
     }
 }