mirror of
https://github.com/wolfpld/tracy.git
synced 2025-03-20 07:40:02 +08:00
Add code transfer from client to server.
This commit is contained in:
+34
-3
@@ -2761,7 +2761,7 @@ void Worker::Exec()
|
||||
if( m_pendingStrings != 0 || m_pendingThreads != 0 || m_pendingSourceLocation != 0 || m_pendingCallstackFrames != 0 ||
|
||||
!m_pendingCustomStrings.empty() || m_data.plots.IsPending() || m_pendingCallstackPtr != 0 ||
|
||||
m_pendingExternalNames != 0 || m_pendingCallstackSubframes != 0 || !m_pendingFrameImageData.empty() ||
|
||||
!m_pendingSymbols.empty() )
|
||||
!m_pendingSymbols.empty() || !m_pendingSymbolCode.empty() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -2815,12 +2815,24 @@ bool Worker::DispatchProcess( const QueueItem& ev, const char*& ptr )
|
||||
if( ev.hdr.idx >= (int)QueueType::StringData )
|
||||
{
|
||||
ptr += sizeof( QueueHeader ) + sizeof( QueueStringTransfer );
|
||||
if( ev.hdr.type == QueueType::FrameImageData )
|
||||
if( ev.hdr.type == QueueType::FrameImageData ||
|
||||
ev.hdr.type == QueueType::SymbolCode )
|
||||
{
|
||||
uint32_t sz;
|
||||
memcpy( &sz, ptr, sizeof( sz ) );
|
||||
ptr += sizeof( sz );
|
||||
AddFrameImageData( ev.stringTransfer.ptr, ptr, sz );
|
||||
switch( ev.hdr.type )
|
||||
{
|
||||
case QueueType::FrameImageData:
|
||||
AddFrameImageData( ev.stringTransfer.ptr, ptr, sz );
|
||||
break;
|
||||
case QueueType::SymbolCode:
|
||||
AddSymbolCode( ev.stringTransfer.ptr, ptr, sz );
|
||||
break;
|
||||
default:
|
||||
assert( false );
|
||||
break;
|
||||
}
|
||||
ptr += sz;
|
||||
}
|
||||
else
|
||||
@@ -3317,6 +3329,18 @@ void Worker::AddFrameImageData( uint64_t ptr, const char* data, size_t sz )
|
||||
m_pendingFrameImageData.emplace( ptr, FrameImagePending { image, csz } );
|
||||
}
|
||||
|
||||
void Worker::AddSymbolCode( uint64_t ptr, const char* data, size_t sz )
|
||||
{
|
||||
auto it = m_pendingSymbolCode.find( ptr );
|
||||
assert( it != m_pendingSymbolCode.end() );
|
||||
m_pendingSymbolCode.erase( it );
|
||||
|
||||
auto code = (char*)m_slab.AllocBig( sz );
|
||||
memcpy( code, data, sz );
|
||||
m_data.symbolCode.emplace( ptr, SymbolCodeData{ code, uint32_t( sz ) } );
|
||||
m_data.symbolCodeSize += sz;
|
||||
}
|
||||
|
||||
uint64_t Worker::GetCanonicalPointer( const CallstackFrameId& id ) const
|
||||
{
|
||||
assert( id.sel == 0 );
|
||||
@@ -5196,6 +5220,13 @@ void Worker::ProcessSymbolInformation( const QueueSymbolInformation& ev )
|
||||
sd.size.SetVal( it->second.size );
|
||||
m_data.symbolMap.emplace( ev.symAddr, std::move( sd ) );
|
||||
|
||||
if( it->second.size > 0 && it->second.size <= 64*1024 )
|
||||
{
|
||||
assert( m_pendingSymbolCode.find( ev.symAddr ) == m_pendingSymbolCode.end() );
|
||||
m_pendingSymbolCode.emplace( ev.symAddr );
|
||||
Query( ServerQuerySymbolCode, ev.symAddr, it->second.size );
|
||||
}
|
||||
|
||||
m_pendingSymbols.erase( it );
|
||||
m_pendingCustomStrings.erase( fit );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user