diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index 55a13c9e..1244979b 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -2869,7 +2869,8 @@ void Profiler::SendString( uint64_t str, const char* ptr, size_t len, QueueType type == QueueType::PlotName || type == QueueType::FrameName || type == QueueType::ExternalName || - type == QueueType::ExternalThreadName ); + type == QueueType::ExternalThreadName || + type == QueueType::FiberName ); QueueItem item; MemWrite( &item.hdr.type, type ); @@ -3311,6 +3312,11 @@ bool Profiler::HandleServerQuery() m_queryDataPtr += 12; AckServerQuery(); break; +#ifdef TRACY_FIBERS + case ServerQueryFiberName: + SendString( ptr, (const char*)ptr, QueueType::FiberName ); + break; +#endif default: assert( false ); break; diff --git a/common/TracyProtocol.hpp b/common/TracyProtocol.hpp index e773c7f7..bda12229 100644 --- a/common/TracyProtocol.hpp +++ b/common/TracyProtocol.hpp @@ -54,7 +54,8 @@ enum ServerQuery : uint8_t ServerQueryCodeLocation, ServerQuerySourceCode, ServerQueryDataTransfer, - ServerQueryDataTransferPart + ServerQueryDataTransferPart, + ServerQueryFiberName }; struct ServerQueryPacket diff --git a/common/TracyQueue.hpp b/common/TracyQueue.hpp index 3e45efff..c656bd39 100644 --- a/common/TracyQueue.hpp +++ b/common/TracyQueue.hpp @@ -111,6 +111,7 @@ enum class QueueType : uint8_t ExternalThreadName, SymbolCode, SourceCode, + FiberName, NUM_TYPES }; @@ -822,6 +823,7 @@ static constexpr size_t QueueDataSize[] = { sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // external thread name sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // symbol code sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // source code + sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // fiber name }; static_assert( QueueItemSize == 32, "Queue item size not 32 bytes" ); diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index e0426800..4e7c29d1 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -266,6 +266,7 @@ Worker::Worker( const char* addr, uint16_t port ) , m_inconsistentSamples( false ) , m_pendingStrings( 0 ) , m_pendingThreads( 0 ) + , m_pendingFibers( 0 ) , m_pendingExternalNames( 0 ) , m_pendingSourceLocation( 0 ) , m_pendingCallstackFrames( 0 ) @@ -3084,7 +3085,7 @@ void Worker::Exec() m_pendingCallstackSubframes != 0 || m_pendingFrameImageData.image != nullptr || !m_pendingSymbols.empty() || !m_pendingSymbolCode.empty() || m_pendingCodeInformation != 0 || !m_serverQueryQueue.empty() || m_pendingSourceLocationPayload != 0 || m_pendingSingleString.ptr != nullptr || m_pendingSecondString.ptr != nullptr || - !m_sourceCodeQuery.empty() ) + !m_sourceCodeQuery.empty() || m_pendingFibers != 0 ) { continue; } @@ -3243,6 +3244,10 @@ void Worker::DispatchFailure( const QueueItem& ev, const char*& ptr ) AddThreadString( ev.stringTransfer.ptr, ptr, sz ); m_serverQuerySpaceLeft++; break; + case QueueType::FiberName: + AddFiberName( ev.stringTransfer.ptr, ptr, sz ); + m_serverQuerySpaceLeft++; + break; case QueueType::PlotName: case QueueType::FrameName: case QueueType::ExternalName: @@ -3406,6 +3411,10 @@ bool Worker::DispatchProcess( const QueueItem& ev, const char*& ptr ) AddThreadString( ev.stringTransfer.ptr, ptr, sz ); m_serverQuerySpaceLeft++; break; + case QueueType::FiberName: + AddFiberName( ev.stringTransfer.ptr, ptr, sz ); + m_serverQuerySpaceLeft++; + break; case QueueType::PlotName: HandlePlotName( ev.stringTransfer.ptr, ptr, sz ); m_serverQuerySpaceLeft++; @@ -3570,6 +3579,7 @@ ThreadData* Worker::NoticeThreadReal( uint64_t thread ) } else { + CheckThreadString( thread ); return NewThread( thread, false ); } } @@ -3646,7 +3656,6 @@ const MemData& Worker::GetMemoryNamed( uint64_t name ) const ThreadData* Worker::NewThread( uint64_t thread, bool fiber ) { - if( !fiber ) CheckThreadString( thread ); auto td = m_slab.AllocInit(); td->id = thread; td->count = 0; @@ -3769,6 +3778,16 @@ void Worker::CheckThreadString( uint64_t id ) if( m_sock.IsValid() ) Query( ServerQueryThreadString, id ); } +void Worker::CheckFiberName( uint64_t id, uint64_t tid ) +{ + if( m_data.threadNames.find( tid ) != m_data.threadNames.end() ) return; + + m_data.threadNames.emplace( tid, "???" ); + m_pendingFibers++; + + if( m_sock.IsValid() ) Query( ServerQueryFiberName, id ); +} + void Worker::CheckExternalName( uint64_t id ) { if( m_data.externalNames.find( id ) != m_data.externalNames.end() ) return; @@ -3895,6 +3914,18 @@ void Worker::AddThreadString( uint64_t id, const char* str, size_t sz ) it->second = sl.ptr; } +void Worker::AddFiberName( uint64_t id, const char* str, size_t sz ) +{ + assert( m_pendingFibers > 0 ); + m_pendingFibers--; + auto it = m_data.fiberToThreadMap.find( id ); + assert( it != m_data.fiberToThreadMap.end() ); + auto tit = m_data.threadNames.find( it->second ); + assert( tit != m_data.threadNames.end() && strcmp( tit->second, "???" ) == 0 ); + const auto sl = StoreString( str, sz ); + tit->second = sl.ptr; +} + void Worker::AddSingleString( const char* str, size_t sz ) { assert( m_pendingSingleString.ptr == nullptr ); @@ -6725,6 +6756,7 @@ void Worker::ProcessFiberEnter( const QueueFiberEnter& ev ) tid = ( uint64_t(1) << 32 ) | m_data.fiberToThreadMap.size(); m_data.fiberToThreadMap.emplace( ev.fiber, tid ); NewThread( tid, true ); + CheckFiberName( ev.fiber, tid ); } else { diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 7b41a94d..b0f09d8a 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -787,6 +787,7 @@ private: bool CheckString( uint64_t ptr ); void CheckThreadString( uint64_t id ); + void CheckFiberName( uint64_t id, uint64_t tid ); void CheckExternalName( uint64_t id ); void AddSourceLocation( const QueueSourceLocation& srcloc ); @@ -794,6 +795,7 @@ private: void AddString( uint64_t ptr, const char* str, size_t sz ); void AddThreadString( uint64_t id, const char* str, size_t sz ); + void AddFiberName( uint64_t id, const char* str, size_t sz ); void AddSingleString( const char* str, size_t sz ); void AddSingleStringFailure( const char* str, size_t sz ); void AddSecondString( const char* str, size_t sz ); @@ -924,6 +926,7 @@ private: uint32_t m_pendingStrings; uint32_t m_pendingThreads; + uint32_t m_pendingFibers; uint32_t m_pendingExternalNames; uint32_t m_pendingSourceLocation; uint32_t m_pendingCallstackFrames;