mirror of
https://github.com/wolfpld/tracy
synced 2025-04-29 04:23:51 +00:00
Add second single string transfer.
This commit is contained in:
parent
a7d2ab4d4f
commit
c0b73c248f
@ -2264,6 +2264,21 @@ void Profiler::SendSingleString( const char* ptr, size_t len )
|
|||||||
AppendDataUnsafe( ptr, l16 );
|
AppendDataUnsafe( ptr, l16 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Profiler::SendSecondString( const char* ptr, size_t len )
|
||||||
|
{
|
||||||
|
QueueItem item;
|
||||||
|
MemWrite( &item.hdr.type, QueueType::SecondStringData );
|
||||||
|
|
||||||
|
assert( len <= std::numeric_limits<uint16_t>::max() );
|
||||||
|
auto l16 = uint16_t( len );
|
||||||
|
|
||||||
|
NeedDataSize( QueueDataSize[(int)QueueType::SecondStringData] + sizeof( l16 ) + l16 );
|
||||||
|
|
||||||
|
AppendDataUnsafe( &item, QueueDataSize[(int)QueueType::SecondStringData] );
|
||||||
|
AppendDataUnsafe( &l16, sizeof( l16 ) );
|
||||||
|
AppendDataUnsafe( ptr, l16 );
|
||||||
|
}
|
||||||
|
|
||||||
void Profiler::SendLongString( uint64_t str, const char* ptr, size_t len, QueueType type )
|
void Profiler::SendLongString( uint64_t str, const char* ptr, size_t len, QueueType type )
|
||||||
{
|
{
|
||||||
assert( type == QueueType::FrameImageData ||
|
assert( type == QueueType::FrameImageData ||
|
||||||
@ -2410,11 +2425,10 @@ void Profiler::SendCallstackFrame( uint64_t ptr )
|
|||||||
const auto& frame = frameData.data[i];
|
const auto& frame = frameData.data[i];
|
||||||
|
|
||||||
SendSingleString( frame.name );
|
SendSingleString( frame.name );
|
||||||
SendString( uint64_t( frame.file ), frame.file, QueueType::CustomStringData );
|
SendSecondString( frame.file );
|
||||||
|
|
||||||
QueueItem item;
|
QueueItem item;
|
||||||
MemWrite( &item.hdr.type, QueueType::CallstackFrame );
|
MemWrite( &item.hdr.type, QueueType::CallstackFrame );
|
||||||
MemWrite( &item.callstackFrame.file, (uint64_t)frame.file );
|
|
||||||
MemWrite( &item.callstackFrame.line, frame.line );
|
MemWrite( &item.callstackFrame.line, frame.line );
|
||||||
MemWrite( &item.callstackFrame.symAddr, frame.symAddr );
|
MemWrite( &item.callstackFrame.symAddr, frame.symAddr );
|
||||||
MemWrite( &item.callstackFrame.symLen, frame.symLen );
|
MemWrite( &item.callstackFrame.symLen, frame.symLen );
|
||||||
|
@ -487,6 +487,8 @@ public:
|
|||||||
void SendString( uint64_t str, const char* ptr, size_t len, QueueType type );
|
void SendString( uint64_t str, const char* ptr, size_t len, QueueType type );
|
||||||
void SendSingleString( const char* ptr ) { SendSingleString( ptr, strlen( ptr ) ); }
|
void SendSingleString( const char* ptr ) { SendSingleString( ptr, strlen( ptr ) ); }
|
||||||
void SendSingleString( const char* ptr, size_t len );
|
void SendSingleString( const char* ptr, size_t len );
|
||||||
|
void SendSecondString( const char* ptr ) { SendSecondString( ptr, strlen( ptr ) ); }
|
||||||
|
void SendSecondString( const char* ptr, size_t len );
|
||||||
|
|
||||||
|
|
||||||
// Allocated source location data layout:
|
// Allocated source location data layout:
|
||||||
|
@ -84,6 +84,7 @@ enum class QueueType : uint8_t
|
|||||||
ParamPingback,
|
ParamPingback,
|
||||||
CpuTopology,
|
CpuTopology,
|
||||||
SingleStringData,
|
SingleStringData,
|
||||||
|
SecondStringData,
|
||||||
StringData,
|
StringData,
|
||||||
ThreadName,
|
ThreadName,
|
||||||
CustomStringData,
|
CustomStringData,
|
||||||
@ -395,7 +396,6 @@ struct QueueCallstackFrameSize
|
|||||||
|
|
||||||
struct QueueCallstackFrame
|
struct QueueCallstackFrame
|
||||||
{
|
{
|
||||||
uint64_t file;
|
|
||||||
uint32_t line;
|
uint32_t line;
|
||||||
uint64_t symAddr;
|
uint64_t symAddr;
|
||||||
uint32_t symLen;
|
uint32_t symLen;
|
||||||
@ -625,6 +625,7 @@ static constexpr size_t QueueDataSize[] = {
|
|||||||
sizeof( QueueHeader ), // param pingback
|
sizeof( QueueHeader ), // param pingback
|
||||||
sizeof( QueueHeader ) + sizeof( QueueCpuTopology ),
|
sizeof( QueueHeader ) + sizeof( QueueCpuTopology ),
|
||||||
sizeof( QueueHeader ), // single string data
|
sizeof( QueueHeader ), // single string data
|
||||||
|
sizeof( QueueHeader ), // second string data
|
||||||
// keep all QueueStringTransfer below
|
// keep all QueueStringTransfer below
|
||||||
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // string data
|
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // string data
|
||||||
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // thread name
|
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // thread name
|
||||||
|
@ -2672,7 +2672,8 @@ void Worker::Exec()
|
|||||||
!m_pendingCustomStrings.empty() || m_data.plots.IsPending() || m_pendingCallstackPtr != 0 ||
|
!m_pendingCustomStrings.empty() || m_data.plots.IsPending() || m_pendingCallstackPtr != 0 ||
|
||||||
m_pendingExternalNames != 0 || m_pendingCallstackSubframes != 0 || m_pendingFrameImageData.image != nullptr ||
|
m_pendingExternalNames != 0 || m_pendingCallstackSubframes != 0 || m_pendingFrameImageData.image != nullptr ||
|
||||||
!m_pendingSymbols.empty() || !m_pendingSymbolCode.empty() || m_pendingCodeInformation != 0 ||
|
!m_pendingSymbols.empty() || !m_pendingSymbolCode.empty() || m_pendingCodeInformation != 0 ||
|
||||||
!m_serverQueryQueue.empty() || m_pendingSourceLocationPayload != 0 || m_pendingSingleString.ptr != nullptr )
|
!m_serverQueryQueue.empty() || m_pendingSourceLocationPayload != 0 || m_pendingSingleString.ptr != nullptr ||
|
||||||
|
m_pendingSecondString.ptr != nullptr )
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -2941,20 +2942,29 @@ bool Worker::DispatchProcess( const QueueItem& ev, const char*& ptr )
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if( ev.hdr.type == QueueType::SingleStringData )
|
|
||||||
{
|
|
||||||
ptr += sizeof( QueueHeader );
|
|
||||||
uint16_t sz;
|
|
||||||
memcpy( &sz, ptr, sizeof( sz ) );
|
|
||||||
ptr += sizeof( sz );
|
|
||||||
AddSingleString( ptr, sz );
|
|
||||||
ptr += sz;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ptr += QueueDataSize[ev.hdr.idx];
|
uint16_t sz;
|
||||||
return Process( ev );
|
switch( ev.hdr.type )
|
||||||
|
{
|
||||||
|
case QueueType::SingleStringData:
|
||||||
|
ptr += sizeof( QueueHeader );
|
||||||
|
memcpy( &sz, ptr, sizeof( sz ) );
|
||||||
|
ptr += sizeof( sz );
|
||||||
|
AddSingleString( ptr, sz );
|
||||||
|
ptr += sz;
|
||||||
|
return true;
|
||||||
|
case QueueType::SecondStringData:
|
||||||
|
ptr += sizeof( QueueHeader );
|
||||||
|
memcpy( &sz, ptr, sizeof( sz ) );
|
||||||
|
ptr += sizeof( sz );
|
||||||
|
AddSecondString( ptr, sz );
|
||||||
|
ptr += sz;
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
ptr += QueueDataSize[ev.hdr.idx];
|
||||||
|
return Process( ev );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3366,6 +3376,12 @@ void Worker::AddSingleString( const char* str, size_t sz )
|
|||||||
m_pendingSingleString = StoreString( str, sz );
|
m_pendingSingleString = StoreString( str, sz );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Worker::AddSecondString( const char* str, size_t sz )
|
||||||
|
{
|
||||||
|
assert( m_pendingSecondString.ptr == nullptr );
|
||||||
|
m_pendingSecondString = StoreString( str, sz );
|
||||||
|
}
|
||||||
|
|
||||||
void Worker::AddExternalName( uint64_t ptr, const char* str, size_t sz )
|
void Worker::AddExternalName( uint64_t ptr, const char* str, size_t sz )
|
||||||
{
|
{
|
||||||
assert( m_pendingExternalNames > 0 );
|
assert( m_pendingExternalNames > 0 );
|
||||||
@ -3834,6 +3850,14 @@ uint32_t Worker::GetSingleStringIdx()
|
|||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Worker::GetSecondStringIdx()
|
||||||
|
{
|
||||||
|
assert( m_pendingSecondString.ptr != nullptr );
|
||||||
|
const auto idx = m_pendingSecondString.idx;
|
||||||
|
m_pendingSecondString.ptr = nullptr;
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
StringLocation Worker::StoreString( const char* str, size_t sz )
|
StringLocation Worker::StoreString( const char* str, size_t sz )
|
||||||
{
|
{
|
||||||
StringLocation ret;
|
StringLocation ret;
|
||||||
@ -5421,11 +5445,7 @@ void Worker::ProcessCallstackFrame( const QueueCallstackFrame& ev )
|
|||||||
assert( m_pendingCallstackSubframes > 0 );
|
assert( m_pendingCallstackSubframes > 0 );
|
||||||
|
|
||||||
const auto nitidx = GetSingleStringIdx();
|
const auto nitidx = GetSingleStringIdx();
|
||||||
|
const auto fitidx = GetSecondStringIdx();
|
||||||
auto fit = m_pendingCustomStrings.find( ev.file );
|
|
||||||
assert( fit != m_pendingCustomStrings.end() );
|
|
||||||
const auto fitidx = fit->second.idx;
|
|
||||||
m_pendingCustomStrings.erase( fit );
|
|
||||||
|
|
||||||
if( m_callstackFrameStaging )
|
if( m_callstackFrameStaging )
|
||||||
{
|
{
|
||||||
|
@ -739,6 +739,7 @@ private:
|
|||||||
void AddThreadString( uint64_t id, const char* str, size_t sz );
|
void AddThreadString( uint64_t id, const char* str, size_t sz );
|
||||||
void AddCustomString( uint64_t ptr, const char* str, size_t sz );
|
void AddCustomString( uint64_t ptr, const char* str, size_t sz );
|
||||||
void AddSingleString( const char* str, size_t sz );
|
void AddSingleString( const char* str, size_t sz );
|
||||||
|
void AddSecondString( const char* str, size_t sz );
|
||||||
void AddExternalName( uint64_t ptr, const char* str, size_t sz );
|
void AddExternalName( uint64_t ptr, const char* str, size_t sz );
|
||||||
void AddExternalThreadName( uint64_t ptr, const char* str, size_t sz );
|
void AddExternalThreadName( uint64_t ptr, const char* str, size_t sz );
|
||||||
void AddFrameImageData( uint64_t ptr, const char* data, size_t sz );
|
void AddFrameImageData( uint64_t ptr, const char* data, size_t sz );
|
||||||
@ -762,6 +763,7 @@ private:
|
|||||||
void DispatchFailure( const QueueItem& ev, const char*& ptr );
|
void DispatchFailure( const QueueItem& ev, const char*& ptr );
|
||||||
|
|
||||||
uint32_t GetSingleStringIdx();
|
uint32_t GetSingleStringIdx();
|
||||||
|
uint32_t GetSecondStringIdx();
|
||||||
StringLocation StoreString( const char* str, size_t sz );
|
StringLocation StoreString( const char* str, size_t sz );
|
||||||
const ContextSwitch* const GetContextSwitchDataImpl( uint64_t thread );
|
const ContextSwitch* const GetContextSwitchDataImpl( uint64_t thread );
|
||||||
|
|
||||||
@ -859,6 +861,7 @@ private:
|
|||||||
unordered_flat_set<StringRef, StringRefHasher, StringRefComparator> m_pendingFileStrings;
|
unordered_flat_set<StringRef, StringRefHasher, StringRefComparator> m_pendingFileStrings;
|
||||||
unordered_flat_set<StringRef, StringRefHasher, StringRefComparator> m_checkedFileStrings;
|
unordered_flat_set<StringRef, StringRefHasher, StringRefComparator> m_checkedFileStrings;
|
||||||
StringLocation m_pendingSingleString = {};
|
StringLocation m_pendingSingleString = {};
|
||||||
|
StringLocation m_pendingSecondString = {};
|
||||||
|
|
||||||
uint32_t m_pendingStrings;
|
uint32_t m_pendingStrings;
|
||||||
uint32_t m_pendingThreads;
|
uint32_t m_pendingThreads;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user