diff --git a/common/TracyProtocol.hpp b/common/TracyProtocol.hpp index 9afcf132..5b94b501 100644 --- a/common/TracyProtocol.hpp +++ b/common/TracyProtocol.hpp @@ -23,6 +23,7 @@ enum ServerQuery : uint8_t ServerQueryThreadString, ServerQuerySourceLocation, ServerQueryPlotName, + ServerQueryCallstackFrame, }; enum { WelcomeMessageProgramNameSize = 64 }; diff --git a/server/TracyEvent.hpp b/server/TracyEvent.hpp index d1a83de8..c5eefb5c 100644 --- a/server/TracyEvent.hpp +++ b/server/TracyEvent.hpp @@ -158,6 +158,16 @@ struct MemEvent enum { MemEventSize = sizeof( MemEvent ) }; static_assert( std::is_standard_layout::value, "MemEvent is not standard layout" ); + +struct CallstackFrame +{ + uint64_t file; + StringIdx name; + uint32_t line; +}; + +enum { CallstackFrameSize = sizeof( CallstackFrame ) }; + #pragma pack() diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 87340d95..1ed1fe0e 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -1333,6 +1333,15 @@ void Worker::AddCallstackPayload( uint64_t ptr, char* _data, size_t sz ) idx = m_data.callstackPayload.size(); m_data.callstackMap.emplace( arr, idx ); m_data.callstackPayload.push_back( arr ); + + for( auto& frame : *arr ) + { + auto fit = m_data.callstackFrameMap.find( frame ); + if( fit == m_data.callstackFrameMap.end() ) + { + ServerQuery( ServerQueryCallstackFrame, frame ); + } + } } else { diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 965caa6c..cc06ba11 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -101,6 +101,7 @@ class Worker flat_hash_map*, uint32_t, VarArrayHasherPOT, VarArrayComparator> callstackMap; Vector*> callstackPayload; + flat_hash_map callstackFrameMap; std::map lockMap;