From 50cda7720fe492738d2155a295919e48176aabeb Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sun, 9 Jun 2019 13:44:53 +0200 Subject: [PATCH] Handle frame image instrumentation failures. --- server/TracyWorker.cpp | 34 +++++++++++++++++++++++++++++----- server/TracyWorker.hpp | 4 ++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index d8c32245..e753743c 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -2887,6 +2887,20 @@ void Worker::FrameEndFailure() m_failureData.srcloc = 0; } +void Worker::FrameImageIndexFailure() +{ + m_failure = Failure::FrameImageIndex; + m_failureData.thread = 0; + m_failureData.srcloc = 0; +} + +void Worker::FrameImageTwiceFailure() +{ + m_failure = Failure::FrameImageTwice; + m_failureData.thread = 0; + m_failureData.srcloc = 0; +} + void Worker::ProcessZoneValidation( const QueueZoneValidation& ev ) { auto td = NoticeThread( ev.thread ); @@ -2957,6 +2971,19 @@ void Worker::ProcessFrameImage( const QueueFrameImage& ev ) auto it = m_pendingFrameImageData.find( ev.image ); assert( it != m_pendingFrameImageData.end() ); + auto& frames = m_data.framesBase->frames; + const auto fidx = (int64_t)frames.size() - 1 - ev.offset; + if( fidx <= 0 ) + { + FrameImageIndexFailure(); + return; + } + if( frames[fidx].frameImage >= 0 ) + { + FrameImageTwiceFailure(); + return; + } + auto fi = m_slab.Alloc(); fi->ptr = PackFrameImage( (const char*)it->second, ev.w, ev.h, fi->csz ); fi->w = ev.w; @@ -2964,11 +2991,6 @@ void Worker::ProcessFrameImage( const QueueFrameImage& ev ) const auto idx = m_data.frameImage.size(); m_data.frameImage.push_back( fi ); - - auto& frames = m_data.framesBase->frames; - const auto fidx = (int64_t)frames.size() - 1 - ev.offset; - assert( fidx >= 0 ); - assert( frames[fidx].frameImage == -1 ); frames[fidx].frameImage = idx; m_pendingFrameImageData.erase( it ); @@ -4411,6 +4433,8 @@ static const char* s_failureReasons[] = { "Zone name transfer destination doesn't match active zone.", "Memory free event without a matching allocation.", "Discontinuous frame begin/end mismatch.", + "Frame image offset is invalid.", + "Multiple frame images were sent for a single frame.", }; static_assert( sizeof( s_failureReasons ) / sizeof( *s_failureReasons ) == (int)Worker::Failure::NUM_FAILURES, "Missing failure reason description." ); diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index d9b47bed..f9920b17 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -231,6 +231,8 @@ public: ZoneName, MemFree, FrameEnd, + FrameImageIndex, + FrameImageTwice, NUM_FAILURES }; @@ -407,6 +409,8 @@ private: void ZoneNameFailure( uint64_t thread ); void MemFreeFailure( uint64_t thread ); void FrameEndFailure(); + void FrameImageIndexFailure(); + void FrameImageTwiceFailure(); tracy_force_inline void CheckSourceLocation( uint64_t ptr ); void NewSourceLocation( uint64_t ptr );