From 4f735e1ae262995a82170e91cf819f5243a4b3e5 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sat, 27 Nov 2021 15:06:58 +0100 Subject: [PATCH] Extract callstack merging. --- server/TracyWorker.cpp | 65 +++++++++++++++++++++++------------------- server/TracyWorker.hpp | 1 + 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 45be7d6a..128f03f4 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -4261,6 +4261,39 @@ void Worker::AddCallstackAllocPayload( uint64_t ptr, const char* data, size_t _s m_pendingCallstackId = idx; } +uint32_t Worker::MergeCallstacks( uint32_t first, uint32_t second ) +{ + const auto& cs1 = GetCallstack( first ); + const auto& cs2 = GetCallstack( second ); + + const auto sz1 = cs1.size(); + const auto sz2 = cs2.size(); + const auto tsz = sz1 + sz2; + + size_t memsize = sizeof( VarArray ) + tsz * sizeof( CallstackFrameId ); + auto mem = (char*)m_slab.AllocRaw( memsize ); + memcpy( mem, cs1.data(), sizeof( CallstackFrameId ) * sz1 ); + memcpy( mem + sizeof( CallstackFrameId ) * sz1, cs2.data(), sizeof( CallstackFrameId ) * sz2 ); + + VarArray* arr = (VarArray*)( mem + tsz * sizeof( CallstackFrameId ) ); + new(arr) VarArray( tsz, (CallstackFrameId*)mem ); + + uint32_t idx; + auto it = m_data.callstackMap.find( arr ); + if( it == m_data.callstackMap.end() ) + { + idx = m_data.callstackPayload.size(); + m_data.callstackMap.emplace( arr, idx ); + m_data.callstackPayload.push_back( arr ); + } + else + { + idx = it->second; + m_slab.Unalloc( memsize ); + } + return idx; +} + void Worker::InsertPlot( PlotData* plot, int64_t time, double val ) { if( plot->data.empty() ) @@ -6412,36 +6445,8 @@ void Worker::ProcessCallstackSample( const QueueCallstackSample& ev ) { if( pendingTime == t ) { - const auto& cs1 = GetCallstack( td.pendingSample.callstack.Val() ); - const auto& cs2 = GetCallstack( callstack ); - - const auto sz1 = cs1.size(); - const auto sz2 = cs2.size(); - const auto tsz = sz1 + sz2; - - size_t memsize = sizeof( VarArray ) + tsz * sizeof( CallstackFrameId ); - auto mem = (char*)m_slab.AllocRaw( memsize ); - memcpy( mem, cs1.data(), sizeof( CallstackFrameId ) * sz1 ); - memcpy( mem + sizeof( CallstackFrameId ) * sz1, cs2.data(), sizeof( CallstackFrameId ) * sz2 ); - - VarArray* arr = (VarArray*)( mem + tsz * sizeof( CallstackFrameId ) ); - new(arr) VarArray( tsz, (CallstackFrameId*)mem ); - - uint32_t idx; - auto it = m_data.callstackMap.find( arr ); - if( it == m_data.callstackMap.end() ) - { - idx = m_data.callstackPayload.size(); - m_data.callstackMap.emplace( arr, idx ); - m_data.callstackPayload.push_back( arr ); - } - else - { - idx = it->second; - m_slab.Unalloc( memsize ); - } - - sd.callstack.SetVal( idx ); + const auto mcs = MergeCallstacks( td.pendingSample.callstack.Val(), callstack ); + sd.callstack.SetVal( mcs ); ProcessCallstackSampleImpl( sd, td ); td.pendingSample.time.Clear(); } diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 9e73bce8..ed1d1c40 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -816,6 +816,7 @@ private: tracy_force_inline void AddCallstackPayload( uint64_t ptr, const char* data, size_t sz ); tracy_force_inline void AddCallstackAllocPayload( uint64_t ptr, const char* data, size_t sz ); + uint32_t MergeCallstacks( uint32_t first, uint32_t second ); void InsertPlot( PlotData* plot, int64_t time, double val ); void HandlePlotName( uint64_t name, const char* str, size_t sz );