From 2f17e338518bbd6b18fe6f738c74e71832315b60 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Fri, 18 Jul 2025 01:16:46 +0200 Subject: [PATCH] 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 --- server/TracyWorker.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index ecae52cb..93866cdf 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -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(); 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; }