1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-29 12:23:53 +00:00

Fiber name transport.

This commit is contained in:
Bartosz Taudul 2021-11-03 18:57:30 +01:00
parent 211b202d8e
commit fceb065329
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
5 changed files with 48 additions and 4 deletions

View File

@ -2869,7 +2869,8 @@ void Profiler::SendString( uint64_t str, const char* ptr, size_t len, QueueType
type == QueueType::PlotName || type == QueueType::PlotName ||
type == QueueType::FrameName || type == QueueType::FrameName ||
type == QueueType::ExternalName || type == QueueType::ExternalName ||
type == QueueType::ExternalThreadName ); type == QueueType::ExternalThreadName ||
type == QueueType::FiberName );
QueueItem item; QueueItem item;
MemWrite( &item.hdr.type, type ); MemWrite( &item.hdr.type, type );
@ -3311,6 +3312,11 @@ bool Profiler::HandleServerQuery()
m_queryDataPtr += 12; m_queryDataPtr += 12;
AckServerQuery(); AckServerQuery();
break; break;
#ifdef TRACY_FIBERS
case ServerQueryFiberName:
SendString( ptr, (const char*)ptr, QueueType::FiberName );
break;
#endif
default: default:
assert( false ); assert( false );
break; break;

View File

@ -54,7 +54,8 @@ enum ServerQuery : uint8_t
ServerQueryCodeLocation, ServerQueryCodeLocation,
ServerQuerySourceCode, ServerQuerySourceCode,
ServerQueryDataTransfer, ServerQueryDataTransfer,
ServerQueryDataTransferPart ServerQueryDataTransferPart,
ServerQueryFiberName
}; };
struct ServerQueryPacket struct ServerQueryPacket

View File

@ -111,6 +111,7 @@ enum class QueueType : uint8_t
ExternalThreadName, ExternalThreadName,
SymbolCode, SymbolCode,
SourceCode, SourceCode,
FiberName,
NUM_TYPES NUM_TYPES
}; };
@ -822,6 +823,7 @@ static constexpr size_t QueueDataSize[] = {
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // external thread name sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // external thread name
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // symbol code sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // symbol code
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // source code sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // source code
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // fiber name
}; };
static_assert( QueueItemSize == 32, "Queue item size not 32 bytes" ); static_assert( QueueItemSize == 32, "Queue item size not 32 bytes" );

View File

@ -266,6 +266,7 @@ Worker::Worker( const char* addr, uint16_t port )
, m_inconsistentSamples( false ) , m_inconsistentSamples( false )
, m_pendingStrings( 0 ) , m_pendingStrings( 0 )
, m_pendingThreads( 0 ) , m_pendingThreads( 0 )
, m_pendingFibers( 0 )
, m_pendingExternalNames( 0 ) , m_pendingExternalNames( 0 )
, m_pendingSourceLocation( 0 ) , m_pendingSourceLocation( 0 )
, m_pendingCallstackFrames( 0 ) , m_pendingCallstackFrames( 0 )
@ -3084,7 +3085,7 @@ void Worker::Exec()
m_pendingCallstackSubframes != 0 || m_pendingFrameImageData.image != nullptr || !m_pendingSymbols.empty() || m_pendingCallstackSubframes != 0 || m_pendingFrameImageData.image != nullptr || !m_pendingSymbols.empty() ||
!m_pendingSymbolCode.empty() || m_pendingCodeInformation != 0 || !m_serverQueryQueue.empty() || !m_pendingSymbolCode.empty() || m_pendingCodeInformation != 0 || !m_serverQueryQueue.empty() ||
m_pendingSourceLocationPayload != 0 || m_pendingSingleString.ptr != nullptr || m_pendingSecondString.ptr != nullptr || m_pendingSourceLocationPayload != 0 || m_pendingSingleString.ptr != nullptr || m_pendingSecondString.ptr != nullptr ||
!m_sourceCodeQuery.empty() ) !m_sourceCodeQuery.empty() || m_pendingFibers != 0 )
{ {
continue; continue;
} }
@ -3243,6 +3244,10 @@ void Worker::DispatchFailure( const QueueItem& ev, const char*& ptr )
AddThreadString( ev.stringTransfer.ptr, ptr, sz ); AddThreadString( ev.stringTransfer.ptr, ptr, sz );
m_serverQuerySpaceLeft++; m_serverQuerySpaceLeft++;
break; break;
case QueueType::FiberName:
AddFiberName( ev.stringTransfer.ptr, ptr, sz );
m_serverQuerySpaceLeft++;
break;
case QueueType::PlotName: case QueueType::PlotName:
case QueueType::FrameName: case QueueType::FrameName:
case QueueType::ExternalName: case QueueType::ExternalName:
@ -3406,6 +3411,10 @@ bool Worker::DispatchProcess( const QueueItem& ev, const char*& ptr )
AddThreadString( ev.stringTransfer.ptr, ptr, sz ); AddThreadString( ev.stringTransfer.ptr, ptr, sz );
m_serverQuerySpaceLeft++; m_serverQuerySpaceLeft++;
break; break;
case QueueType::FiberName:
AddFiberName( ev.stringTransfer.ptr, ptr, sz );
m_serverQuerySpaceLeft++;
break;
case QueueType::PlotName: case QueueType::PlotName:
HandlePlotName( ev.stringTransfer.ptr, ptr, sz ); HandlePlotName( ev.stringTransfer.ptr, ptr, sz );
m_serverQuerySpaceLeft++; m_serverQuerySpaceLeft++;
@ -3570,6 +3579,7 @@ ThreadData* Worker::NoticeThreadReal( uint64_t thread )
} }
else else
{ {
CheckThreadString( thread );
return NewThread( thread, false ); return NewThread( thread, false );
} }
} }
@ -3646,7 +3656,6 @@ const MemData& Worker::GetMemoryNamed( uint64_t name ) const
ThreadData* Worker::NewThread( uint64_t thread, bool fiber ) ThreadData* Worker::NewThread( uint64_t thread, bool fiber )
{ {
if( !fiber ) CheckThreadString( thread );
auto td = m_slab.AllocInit<ThreadData>(); auto td = m_slab.AllocInit<ThreadData>();
td->id = thread; td->id = thread;
td->count = 0; td->count = 0;
@ -3769,6 +3778,16 @@ void Worker::CheckThreadString( uint64_t id )
if( m_sock.IsValid() ) Query( ServerQueryThreadString, 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 ) void Worker::CheckExternalName( uint64_t id )
{ {
if( m_data.externalNames.find( id ) != m_data.externalNames.end() ) return; 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; 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 ) void Worker::AddSingleString( const char* str, size_t sz )
{ {
assert( m_pendingSingleString.ptr == nullptr ); assert( m_pendingSingleString.ptr == nullptr );
@ -6725,6 +6756,7 @@ void Worker::ProcessFiberEnter( const QueueFiberEnter& ev )
tid = ( uint64_t(1) << 32 ) | m_data.fiberToThreadMap.size(); tid = ( uint64_t(1) << 32 ) | m_data.fiberToThreadMap.size();
m_data.fiberToThreadMap.emplace( ev.fiber, tid ); m_data.fiberToThreadMap.emplace( ev.fiber, tid );
NewThread( tid, true ); NewThread( tid, true );
CheckFiberName( ev.fiber, tid );
} }
else else
{ {

View File

@ -787,6 +787,7 @@ private:
bool CheckString( uint64_t ptr ); bool CheckString( uint64_t ptr );
void CheckThreadString( uint64_t id ); void CheckThreadString( uint64_t id );
void CheckFiberName( uint64_t id, uint64_t tid );
void CheckExternalName( uint64_t id ); void CheckExternalName( uint64_t id );
void AddSourceLocation( const QueueSourceLocation& srcloc ); void AddSourceLocation( const QueueSourceLocation& srcloc );
@ -794,6 +795,7 @@ private:
void AddString( uint64_t ptr, const char* str, size_t sz ); void AddString( uint64_t ptr, const char* str, size_t sz );
void AddThreadString( uint64_t id, 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 AddSingleString( const char* str, size_t sz );
void AddSingleStringFailure( const char* str, size_t sz ); void AddSingleStringFailure( const char* str, size_t sz );
void AddSecondString( 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_pendingStrings;
uint32_t m_pendingThreads; uint32_t m_pendingThreads;
uint32_t m_pendingFibers;
uint32_t m_pendingExternalNames; uint32_t m_pendingExternalNames;
uint32_t m_pendingSourceLocation; uint32_t m_pendingSourceLocation;
uint32_t m_pendingCallstackFrames; uint32_t m_pendingCallstackFrames;