From aa8b60a824631ffd698ff95ef3dbf06d6cdb5827 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Fri, 7 Aug 2020 19:05:04 +0200 Subject: [PATCH] Calculate per-symbol sample time list. This is for loaded traces. Real time capture will be implemented later. --- server/TracyWorker.cpp | 33 +++++++++++++++++++++++++++++++++ server/TracyWorker.hpp | 1 + 2 files changed, 34 insertions(+) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 18e68fdd..aed2b31c 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -1670,6 +1670,39 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks ) m_data.ghostZonesReady = true; m_data.ghostCnt = gcnt; } ) ); + + jobs.emplace_back( std::thread( [this] { + for( auto& t : m_data.threads ) + { + for( auto& v : t->samples ) + { + const auto& time = v.time; + const auto cs = v.callstack.Val(); + const auto& callstack = GetCallstack( cs ); + auto& ip = callstack[0]; + auto frame = GetCallstackFrame( ip ); + if( frame ) + { + const auto symAddr = frame->data[0].symAddr; + auto it = m_data.symbolSamples.find( symAddr ); + if( it == m_data.symbolSamples.end() ) + { + m_data.symbolSamples.emplace( symAddr, Vector( time ) ); + } + else + { + it->second.push_back( time ); + } + } + } + } + for( auto& v : m_data.symbolSamples ) + { + pdqsort_branchless( v.second.begin(), v.second.end(), []( const auto& lhs, const auto& rhs ) { return lhs.Val() < rhs.Val(); } ); + } + std::lock_guard lock( m_data.lock ); + m_data.symbolSamplesReady = true; + } ) ); } for( auto& job : jobs ) job.join(); diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 1b60e52e..d1fb0a04 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -288,6 +288,7 @@ private: unordered_flat_map postponedSamples; unordered_flat_map pendingInstructionPointers; unordered_flat_map> instructionPointersMap; + unordered_flat_map> symbolSamples; bool newFramesWereReceived = false; bool callstackSamplesReady = false; bool ghostZonesReady = false;