mirror of
https://github.com/wolfpld/tracy.git
synced 2026-10-23 09:10:51 +00:00
Prevent duplicate callstack frame queries.
Callstack frames will now have nullptr as the value in the callstackFrameMap map, as a way to signal that a query for given key is already pending. Duplicate queries should no longer happen. @slomp provided alternative implementation, which produced the following results: Queries made: 195,778 Duplicate queries skipped: 9,518,910 Co-authored-by: Marcos Slomp <slomp@adobe.com>
This commit is contained in:
@@ -3203,6 +3203,7 @@ void Worker::QueryCallstackFrame( uint64_t addr )
|
||||
if( m_data.callstackFrameMap.contains( packed ) ) return;
|
||||
|
||||
m_pendingCallstackFrames++;
|
||||
m_data.callstackFrameMap.emplace( packed, nullptr );
|
||||
Query( ServerQueryCallstackFrame, addr );
|
||||
}
|
||||
|
||||
@@ -6515,7 +6516,7 @@ void Worker::ProcessCallstackFrameSize( const QueueCallstackFrameSize& ev )
|
||||
|
||||
// Frames may be duplicated due to recursion
|
||||
auto fmit = m_data.callstackFrameMap.find( PackPointer( ev.ptr ) );
|
||||
if( fmit == m_data.callstackFrameMap.end() )
|
||||
if( !fmit->second )
|
||||
{
|
||||
m_callstackFrameStaging = m_slab.Alloc<CallstackFrameData>();
|
||||
m_callstackFrameStaging->size = ev.size;
|
||||
@@ -6628,8 +6629,10 @@ void Worker::ProcessCallstackFrame( const QueueCallstackFrame& ev, bool querySym
|
||||
|
||||
if( --m_pendingCallstackSubframes == 0 )
|
||||
{
|
||||
assert( m_data.callstackFrameMap.find( frameId ) == m_data.callstackFrameMap.end() );
|
||||
m_data.callstackFrameMap.emplace( frameId, m_callstackFrameStaging );
|
||||
auto fit = m_data.callstackFrameMap.find( frameId );
|
||||
assert( fit != m_data.callstackFrameMap.end() );
|
||||
assert( !fit->second );
|
||||
fit->second = m_callstackFrameStaging;
|
||||
m_data.codeSymbolMap.emplace( m_callstackFrameStagingPtr, m_callstackFrameStaging->data[0].symAddr );
|
||||
m_callstackFrameStaging = nullptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user