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 19:47:09 +0300
committerBartosz Taudul <wolf@nereid.pl>2021-11-27 19:47:09 +0300
commitd8a611e9526536adfb6accf6db0b6113bb5a5a20 (patch)
tree16e30c5f861699993a6abda12958210fd57bacce
parent687d4defc01865b8248e85809884e02412c4d0ed (diff)
Also calculate sample parents without inlines.
-rw-r--r--server/TracyEvent.hpp1
-rw-r--r--server/TracyWorker.cpp104
2 files changed, 74 insertions, 31 deletions
diff --git a/server/TracyEvent.hpp b/server/TracyEvent.hpp
index cb04a5ad..56c7df07 100644
--- a/server/TracyEvent.hpp
+++ b/server/TracyEvent.hpp
@@ -828,6 +828,7 @@ struct SymbolStats
{
uint32_t incl, excl;
unordered_flat_map<uint32_t, uint32_t> parents;
+ unordered_flat_map<uint32_t, uint32_t> baseParents;
};
enum { SymbolStatsSize = sizeof( SymbolStats ) };
diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp
index 3170e56f..dd302290 100644
--- a/server/TracyWorker.cpp
+++ b/server/TracyWorker.cpp
@@ -7386,54 +7386,96 @@ void Worker::UpdateSampleStatisticsImpl( const CallstackFrameData** frames, uint
}
}
- const auto sz = framesCount - ( fxsz == 1 );
- const auto memsize = sizeof( VarArray<CallstackFrameId> ) + sz * sizeof( CallstackFrameId );
- auto mem = (char*)m_slab.AllocRaw( memsize );
-
- auto data = (CallstackFrameId*)mem;
- auto dst = data;
- if( fxsz == 1 )
+ uint32_t parentIdx;
{
- for( int i=0; i<sz; i++ )
+ const auto sz = framesCount - ( fxsz == 1 );
+ const auto memsize = sizeof( VarArray<CallstackFrameId> ) + sz * sizeof( CallstackFrameId );
+ auto mem = (char*)m_slab.AllocRaw( memsize );
+
+ auto data = (CallstackFrameId*)mem;
+ auto dst = data;
+ if( fxsz == 1 )
{
- *dst++ = cs[i+1];
+ for( int i=0; i<sz; i++ )
+ {
+ *dst++ = cs[i+1];
+ }
}
- }
- else
- {
- *dst++ = parentFrameId;
- for( int i=1; i<sz; i++ )
+ else
{
- *dst++ = cs[i];
+ *dst++ = parentFrameId;
+ for( int i=1; i<sz; i++ )
+ {
+ *dst++ = cs[i];
+ }
}
- }
- auto arr = (VarArray<CallstackFrameId>*)( mem + sz * sizeof( CallstackFrameId ) );
- new(arr) VarArray<CallstackFrameId>( sz, data );
+ auto arr = (VarArray<CallstackFrameId>*)( mem + sz * sizeof( CallstackFrameId ) );
+ new(arr) VarArray<CallstackFrameId>( sz, data );
- uint32_t idx;
- auto it = m_data.parentCallstackMap.find( arr );
- if( it == m_data.parentCallstackMap.end() )
+ auto it = m_data.parentCallstackMap.find( arr );
+ if( it == m_data.parentCallstackMap.end() )
+ {
+ parentIdx = m_data.parentCallstackPayload.size();
+ m_data.parentCallstackMap.emplace( arr, parentIdx );
+ m_data.parentCallstackPayload.push_back( arr );
+ }
+ else
+ {
+ parentIdx = it->second;
+ m_slab.Unalloc( memsize );
+ }
+ }
+
+ sym0 = m_data.symbolStats.find( frame0.symAddr );
+ auto sit = sym0->second.parents.find( parentIdx );
+ if( sit == sym0->second.parents.end() )
{
- idx = m_data.parentCallstackPayload.size();
- m_data.parentCallstackMap.emplace( arr, idx );
- m_data.parentCallstackPayload.push_back( arr );
+ sym0->second.parents.emplace( parentIdx, count );
}
else
{
- idx = it->second;
- m_slab.Unalloc( memsize );
+ sit->second += count;
}
- sym0 = m_data.symbolStats.find( frame0.symAddr );
- auto sit = sym0->second.parents.find( idx );
- if( sit == sym0->second.parents.end() )
+ uint32_t baseParentIdx;
+ {
+ const auto sz = framesCount - 1;
+ const auto memsize = sizeof( VarArray<CallstackFrameId> ) + sz * sizeof( CallstackFrameId );
+ auto mem = (char*)m_slab.AllocRaw( memsize );
+
+ auto data = (CallstackFrameId*)mem;
+ auto dst = data;
+ for( int i=0; i<sz; i++ )
+ {
+ *dst++ = cs[i+1];
+ }
+
+ auto arr = (VarArray<CallstackFrameId>*)( mem + sz * sizeof( CallstackFrameId ) );
+ new(arr) VarArray<CallstackFrameId>( sz, data );
+
+ auto it = m_data.parentCallstackMap.find( arr );
+ if( it == m_data.parentCallstackMap.end() )
+ {
+ baseParentIdx = m_data.parentCallstackPayload.size();
+ m_data.parentCallstackMap.emplace( arr, baseParentIdx );
+ m_data.parentCallstackPayload.push_back( arr );
+ }
+ else
+ {
+ baseParentIdx = it->second;
+ m_slab.Unalloc( memsize );
+ }
+ }
+
+ auto bit = sym0->second.baseParents.find( baseParentIdx );
+ if( bit == sym0->second.baseParents.end() )
{
- sym0->second.parents.emplace( idx, count );
+ sym0->second.baseParents.emplace( baseParentIdx, count );
}
else
{
- sit->second += count;
+ bit->second += count;
}
}
#endif