diff options
author | Bartosz Taudul <wolf@nereid.pl> | 2021-11-27 19:47:09 +0300 |
---|---|---|
committer | Bartosz Taudul <wolf@nereid.pl> | 2021-11-27 19:47:09 +0300 |
commit | d8a611e9526536adfb6accf6db0b6113bb5a5a20 (patch) | |
tree | 16e30c5f861699993a6abda12958210fd57bacce | |
parent | 687d4defc01865b8248e85809884e02412c4d0ed (diff) |
Also calculate sample parents without inlines.
-rw-r--r-- | server/TracyEvent.hpp | 1 | ||||
-rw-r--r-- | server/TracyWorker.cpp | 104 |
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 |