#ifndef __TRACYPROTOCOL_HPP__ #define __TRACYPROTOCOL_HPP__ #include #include namespace tracy { constexpr unsigned Lz4CompressBound( unsigned isize ) { return isize + ( isize / 255 ) + 16; } enum : uint32_t { ProtocolVersion = 40 }; enum : uint16_t { BroadcastVersion = 2 }; using lz4sz_t = uint32_t; enum { TargetFrameSize = 256 * 1024 }; enum { LZ4Size = Lz4CompressBound( TargetFrameSize ) }; static_assert( LZ4Size <= std::numeric_limits::max(), "LZ4Size greater than lz4sz_t" ); static_assert( TargetFrameSize * 2 >= 64 * 1024, "Not enough space for LZ4 stream buffer" ); enum { HandshakeShibbolethSize = 8 }; static const char HandshakeShibboleth[HandshakeShibbolethSize] = { 'T', 'r', 'a', 'c', 'y', 'P', 'r', 'f' }; enum HandshakeStatus : uint8_t { HandshakePending, HandshakeWelcome, HandshakeProtocolMismatch, HandshakeNotAvailable, HandshakeDropped }; enum { WelcomeMessageProgramNameSize = 64 }; enum { WelcomeMessageHostInfoSize = 1024 }; #pragma pack( 1 ) // Must increase left query space after handling! enum ServerQuery : uint8_t { ServerQueryTerminate, ServerQueryString, ServerQueryThreadString, ServerQuerySourceLocation, ServerQueryPlotName, ServerQueryCallstackFrame, ServerQueryFrameName, ServerQueryDisconnect, ServerQueryExternalName, ServerQueryParameter, ServerQuerySymbol, ServerQuerySymbolCode, ServerQueryCodeLocation }; struct ServerQueryPacket { ServerQuery type; uint64_t ptr; uint32_t extra; }; enum { ServerQueryPacketSize = sizeof( ServerQueryPacket ) }; enum CpuArchitecture : uint8_t { CpuArchUnknown, CpuArchX86, CpuArchX64, CpuArchArm32, CpuArchArm64 }; struct WelcomeMessage { double timerMul; int64_t initBegin; int64_t initEnd; uint64_t delay; uint64_t resolution; uint64_t epoch; uint64_t pid; int64_t samplingPeriod; uint8_t onDemand; uint8_t isApple; uint8_t cpuArch; uint8_t codeTransfer; char cpuManufacturer[12]; uint32_t cpuId; char programName[WelcomeMessageProgramNameSize]; char hostInfo[WelcomeMessageHostInfoSize]; }; enum { WelcomeMessageSize = sizeof( WelcomeMessage ) }; struct OnDemandPayloadMessage { uint64_t frames; uint64_t currentTime; }; enum { OnDemandPayloadMessageSize = sizeof( OnDemandPayloadMessage ) }; struct BroadcastMessage { uint16_t broadcastVersion; uint16_t listenPort; uint32_t protocolVersion; int32_t activeTime; // in seconds char programName[WelcomeMessageProgramNameSize]; }; enum { BroadcastMessageSize = sizeof( BroadcastMessage ) }; #pragma pack() } #endif