From 9209bcdafda29daccbc682d05d1565fcd877790c Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sun, 2 Aug 2026 19:56:37 +0200 Subject: [PATCH] Add connectionId protection to C API zone functions. --- public/client/TracyProfiler.cpp | 33 +++++++++++++++++++++++++++++++++ public/tracy/TracyC.h | 3 +++ 2 files changed, 36 insertions(+) diff --git a/public/client/TracyProfiler.cpp b/public/client/TracyProfiler.cpp index 68c0a181..550318ef 100644 --- a/public/client/TracyProfiler.cpp +++ b/public/client/TracyProfiler.cpp @@ -4568,6 +4568,9 @@ TRACY_API TracyCZoneCtx ___tracy_emit_zone_begin( const struct ___tracy_source_l ctx.active = active; #endif if( !ctx.active ) return ctx; +#ifdef TRACY_ON_DEMAND + ctx.connectionId = tracy::GetProfiler().ConnectionId(); +#endif const auto id = tracy::GetProfiler().GetNextZoneId(); ctx.id = id; @@ -4596,6 +4599,9 @@ TRACY_API TracyCZoneCtx ___tracy_emit_zone_begin_callstack( const struct ___trac ctx.active = active; #endif if( !ctx.active ) return ctx; +#ifdef TRACY_ON_DEMAND + ctx.connectionId = tracy::GetProfiler().ConnectionId(); +#endif const auto id = tracy::GetProfiler().GetNextZoneId(); ctx.id = id; @@ -4633,6 +4639,9 @@ TRACY_API TracyCZoneCtx ___tracy_emit_zone_begin_alloc( uint64_t srcloc, int32_t tracy::tracy_free( (void*)srcloc ); return ctx; } +#ifdef TRACY_ON_DEMAND + ctx.connectionId = tracy::GetProfiler().ConnectionId(); +#endif const auto id = tracy::GetProfiler().GetNextZoneId(); ctx.id = id; @@ -4665,6 +4674,9 @@ TRACY_API TracyCZoneCtx ___tracy_emit_zone_begin_alloc_callstack( uint64_t srclo tracy::tracy_free( (void*)srcloc ); return ctx; } +#ifdef TRACY_ON_DEMAND + ctx.connectionId = tracy::GetProfiler().ConnectionId(); +#endif const auto id = tracy::GetProfiler().GetNextZoneId(); ctx.id = id; @@ -4692,6 +4704,9 @@ TRACY_API TracyCZoneCtx ___tracy_emit_zone_begin_alloc_callstack( uint64_t srclo TRACY_API void ___tracy_emit_zone_end( TracyCZoneCtx ctx ) { if( !ctx.active ) return; +#ifdef TRACY_ON_DEMAND + if( tracy::GetProfiler().ConnectionId() != ctx.connectionId ) return; +#endif #ifndef TRACY_NO_VERIFY { TracyQueuePrepareC( tracy::QueueType::ZoneValidation ); @@ -4710,6 +4725,9 @@ TRACY_API void ___tracy_emit_zone_text( TracyCZoneCtx ctx, const char* txt, size { assert( size < std::numeric_limits::max() ); if( !ctx.active ) return; +#ifdef TRACY_ON_DEMAND + if( tracy::GetProfiler().ConnectionId() != ctx.connectionId ) return; +#endif auto ptr = (char*)tracy::tracy_malloc( size ); memcpy( ptr, txt, size ); #ifndef TRACY_NO_VERIFY @@ -4730,6 +4748,9 @@ TRACY_API void ___tracy_emit_zone_text( TracyCZoneCtx ctx, const char* txt, size TRACY_API void ___tracy_emit_zone_text_fmt( TracyCZoneCtx ctx, const char* fmt, ... ) { if( !ctx.active ) return; +#ifdef TRACY_ON_DEMAND + if( tracy::GetProfiler().ConnectionId() != ctx.connectionId ) return; +#endif va_list args; va_start( args, fmt ); auto size = vsnprintf( nullptr, 0, fmt, args ); @@ -4759,6 +4780,9 @@ TRACY_API void ___tracy_emit_zone_name( TracyCZoneCtx ctx, const char* txt, size { assert( size < std::numeric_limits::max() ); if( !ctx.active ) return; +#ifdef TRACY_ON_DEMAND + if( tracy::GetProfiler().ConnectionId() != ctx.connectionId ) return; +#endif auto ptr = (char*)tracy::tracy_malloc( size ); memcpy( ptr, txt, size ); #ifndef TRACY_NO_VERIFY @@ -4779,6 +4803,9 @@ TRACY_API void ___tracy_emit_zone_name( TracyCZoneCtx ctx, const char* txt, size TRACY_API void ___tracy_emit_zone_name_fmt( TracyCZoneCtx ctx, const char* fmt, ... ) { if( !ctx.active ) return; +#ifdef TRACY_ON_DEMAND + if( tracy::GetProfiler().ConnectionId() != ctx.connectionId ) return; +#endif va_list args; va_start( args, fmt ); auto size = vsnprintf( nullptr, 0, fmt, args ); @@ -4806,6 +4833,9 @@ TRACY_API void ___tracy_emit_zone_name_fmt( TracyCZoneCtx ctx, const char* fmt, TRACY_API void ___tracy_emit_zone_color( TracyCZoneCtx ctx, uint32_t color ) { if( !ctx.active ) return; +#ifdef TRACY_ON_DEMAND + if( tracy::GetProfiler().ConnectionId() != ctx.connectionId ) return; +#endif #ifndef TRACY_NO_VERIFY { TracyQueuePrepareC( tracy::QueueType::ZoneValidation ); @@ -4825,6 +4855,9 @@ TRACY_API void ___tracy_emit_zone_color( TracyCZoneCtx ctx, uint32_t color ) { TRACY_API void ___tracy_emit_zone_value( TracyCZoneCtx ctx, uint64_t value ) { if( !ctx.active ) return; +#ifdef TRACY_ON_DEMAND + if( tracy::GetProfiler().ConnectionId() != ctx.connectionId ) return; +#endif #ifndef TRACY_NO_VERIFY { TracyQueuePrepareC( tracy::QueueType::ZoneValidation ); diff --git a/public/tracy/TracyC.h b/public/tracy/TracyC.h index ea981eaa..6642e547 100644 --- a/public/tracy/TracyC.h +++ b/public/tracy/TracyC.h @@ -162,6 +162,9 @@ struct ___tracy_c_zone_context { uint32_t id; int32_t active; +#ifdef TRACY_ON_DEMAND + uint64_t connectionId; +#endif }; struct ___tracy_gpu_time_data