Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/wolfpld/tracy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Taudul <wolf@nereid.pl>2021-11-27 17:06:58 +0300
committerBartosz Taudul <wolf@nereid.pl>2021-11-27 17:06:58 +0300
commit4f735e1ae262995a82170e91cf819f5243a4b3e5 (patch)
tree2602fe66a626b62535eca4a57d012c1baf153a2b
parent58d5fb2ff40875ac0cc6ba90c1c0db7ef4f2d126 (diff)
Extract callstack merging.
-rw-r--r--server/TracyWorker.cpp65
-rw-r--r--server/TracyWorker.hpp1
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<CallstackFrameId> ) + 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<CallstackFrameId>* arr = (VarArray<CallstackFrameId>*)( mem + tsz * sizeof( CallstackFrameId ) );
+ new(arr) VarArray<CallstackFrameId>( 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<CallstackFrameId> ) + 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<CallstackFrameId>* arr = (VarArray<CallstackFrameId>*)( mem + tsz * sizeof( CallstackFrameId ) );
- new(arr) VarArray<CallstackFrameId>( 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 );