From 188f959ac91d38647a3fda17c065c026242b5e65 Mon Sep 17 00:00:00 2001 From: Dirk Eibach Date: Mon, 9 Dec 2024 23:07:34 +0100 Subject: [PATCH] Add client side fragmented blob support --- public/client/TracyProfiler.cpp | 18 ++++++++++++++++-- public/client/TracyProfiler.hpp | 2 ++ public/common/TracyQueue.hpp | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/public/client/TracyProfiler.cpp b/public/client/TracyProfiler.cpp index b34d5af50..87adf1895 100644 --- a/public/client/TracyProfiler.cpp +++ b/public/client/TracyProfiler.cpp @@ -2464,7 +2464,7 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) case QueueType::BlobCallstack: ptr = MemRead( &item->blobData.data ); size = MemRead( &item->blobData.size ); - SendSingleString( (const char*)ptr, size ); + SendBlob( (const char*)ptr, size ); tracy_free_fast( (void*)ptr ); break; case QueueType::ZoneBeginAllocSrcLoc: @@ -2999,7 +2999,7 @@ Profiler::DequeueStatus Profiler::DequeueSerial() ThreadCtxCheckSerial( blobDataThread ); ptr = MemRead( &item->blobData.data ); uint16_t size = MemRead( &item->blobData.size ); - SendSingleString( (const char*)ptr, size ); + SendBlob( (const char*)ptr, size ); tracy_free_fast( (void*)ptr ); break; } @@ -3267,6 +3267,20 @@ void Profiler::SendLongString( uint64_t str, const char* ptr, size_t len, QueueT AppendDataUnsafe( ptr, l32 ); } +void Profiler::SendBlob( const char* ptr, size_t len ) +{ + QueueItem item; + MemWrite( &item.hdr.type, QueueType::BlobFragment ); + while (len) + { + uint32_t fragment_size = len > TargetFrameSize ? TargetFrameSize : len; + len -= fragment_size; + AppendDataUnsafe( &item, QueueDataSize[(int)QueueType::BlobFragment] ); + AppendDataUnsafe( &fragment_size, sizeof( fragment_size ) ); + AppendDataUnsafe( ptr, fragment_size ); + } +} + void Profiler::SendSourceLocation( uint64_t ptr ) { auto srcloc = (const SourceLocationData*)ptr; diff --git a/public/client/TracyProfiler.hpp b/public/client/TracyProfiler.hpp index 72b3caede..a20c3baac 100644 --- a/public/client/TracyProfiler.hpp +++ b/public/client/TracyProfiler.hpp @@ -790,6 +790,8 @@ class Profiler void SendSecondString( const char* ptr ) { SendSecondString( ptr, strlen( ptr ) ); } void SendSecondString( const char* ptr, size_t len ); + void SendBlob( const char* ptr, size_t len ); + // Allocated source location data layout: // 2b payload size diff --git a/public/common/TracyQueue.hpp b/public/common/TracyQueue.hpp index 0e58a69ea..64a911abd 100644 --- a/public/common/TracyQueue.hpp +++ b/public/common/TracyQueue.hpp @@ -126,6 +126,7 @@ enum class QueueType : uint8_t SymbolCode, SourceCode, FiberName, + BlobFragment, NUM_TYPES }; @@ -931,6 +932,7 @@ static constexpr size_t QueueDataSize[] = { sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // symbol code sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // source code sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // fiber name + sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // blob fragment }; static_assert( QueueItemSize == 32, "Queue item size not 32 bytes" );