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:
Bartosz Taudul
2025-07-18 01:16:46 +02:00
parent c704f909be
commit 2f17e33851

View File

@@ -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;
}