From 0c0afa5ac7bb6c973bd6e38669a220387a065eb8 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Wed, 20 Jun 2018 01:07:09 +0200 Subject: [PATCH] Process callstack frames. --- server/TracyWorker.cpp | 25 +++++++++++++++++++++++++ server/TracyWorker.hpp | 1 + 2 files changed, 26 insertions(+) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 1ed1fe0e..eba67b79 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -1545,6 +1545,9 @@ void Worker::Process( const QueueItem& ev ) case QueueType::CallstackMemory: ProcessCallstackMemory( ev.callstackMemory ); break; + case QueueType::CallstackFrame: + ProcessCallstackFrame( ev.callstackFrame ); + break; case QueueType::Terminate: m_terminate = true; break; @@ -2097,6 +2100,28 @@ void Worker::ProcessCallstackMemory( const QueueCallstackMemory& ev ) m_pendingCallstacks.erase( it ); } +void Worker::ProcessCallstackFrame( const QueueCallstackFrame& ev ) +{ + auto fmit = m_data.callstackFrameMap.find( ev.ptr ); + auto it = m_pendingCustomStrings.find( ev.name ); + assert( it != m_pendingCustomStrings.end() ); + + // Frames may be duplicated due to recursion + if( fmit == m_data.callstackFrameMap.end() ) + { + CheckString( ev.file ); + + auto frame = m_slab.Alloc(); + frame->name = StringIdx( it->second.idx ); + frame->file = ev.file; + frame->line = ev.line; + + m_data.callstackFrameMap.emplace( ev.ptr, frame ); + } + + m_pendingCustomStrings.erase( it ); +} + void Worker::MemAllocChanged( int64_t time ) { const auto val = (double)m_data.memory.usage; diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index cc06ba11..aef69417 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -220,6 +220,7 @@ private: tracy_force_inline void ProcessMemAllocCallstack( const QueueMemAlloc& ev ); tracy_force_inline void ProcessMemFreeCallstack( const QueueMemFree& ev ); tracy_force_inline void ProcessCallstackMemory( const QueueCallstackMemory& ev ); + tracy_force_inline void ProcessCallstackFrame( const QueueCallstackFrame& ev ); tracy_force_inline void CheckSourceLocation( uint64_t ptr ); void NewSourceLocation( uint64_t ptr );