From 6455fcfa91b42474b3bd945491bf9f11fd76fcf9 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sun, 1 May 2022 22:52:20 +0200 Subject: [PATCH] Make source code query handling easier to follow. Also, limit debuginfod source file upload to not exceed target frame size. --- client/TracyProfiler.cpp | 82 ++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 50 deletions(-) diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index a2033a9a..dcda00bf 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -3813,29 +3813,25 @@ void Profiler::HandleSourceCodeQuery() assert( m_queryData ); InitRpmalloc(); + bool ok = false; struct stat st; - if( stat( m_queryData, &st ) == 0 && (uint64_t)st.st_mtime < m_exectime && st.st_size < ( TargetFrameSize - 16 ) ) + if( stat( m_queryData, &st ) == 0 && (uint64_t)st.st_mtime < m_exectime ) { - FILE* f = fopen( m_queryData, "rb" ); - tracy_free_fast( m_queryData ); - if( f ) + if( st.st_size < ( TargetFrameSize - 16 ) ) { - auto ptr = (char*)tracy_malloc_fast( st.st_size ); - auto rd = fread( ptr, 1, st.st_size, f ); - fclose( f ); - if( rd == (size_t)st.st_size ) + FILE* f = fopen( m_queryData, "rb" ); + if( f ) { - SendLongString( (uint64_t)ptr, ptr, rd, QueueType::SourceCode ); + auto ptr = (char*)tracy_malloc_fast( st.st_size ); + auto rd = fread( ptr, 1, st.st_size, f ); + fclose( f ); + if( rd == (size_t)st.st_size ) + { + SendLongString( (uint64_t)ptr, ptr, rd, QueueType::SourceCode ); + ok = true; + } + tracy_free_fast( ptr ); } - else - { - AckSourceCodeNotAvailable(); - } - tracy_free_fast( ptr ); - } - else - { - AckSourceCodeNotAvailable(); } } #ifdef TRACY_DEBUGINFOD @@ -3850,44 +3846,30 @@ void Profiler::HandleSourceCodeQuery() { struct stat st; fstat( d, &st ); - lseek( d, 0, SEEK_SET ); - auto ptr = (char*)tracy_malloc_fast( st.st_size ); - auto rd = read( d, ptr, st.st_size ); + if( st.st_size < ( TargetFrameSize - 16 ) ) + { + lseek( d, 0, SEEK_SET ); + auto ptr = (char*)tracy_malloc_fast( st.st_size ); + auto rd = read( d, ptr, st.st_size ); + if( rd == (size_t)st.st_size ) + { + SendLongString( (uint64_t)ptr, ptr, rd, QueueType::SourceCode ); + ok = true; + } + tracy_free_fast( ptr ); + } close( d ); - if( rd == (size_t)st.st_size ) - { - SendLongString( (uint64_t)ptr, ptr, rd, QueueType::SourceCode ); - } - else - { - AckSourceCodeNotAvailable(); - } - tracy_free_fast( ptr ); - } - else - { - AckSourceCodeNotAvailable(); } } - else - { - AckSourceCodeNotAvailable(); - } - tracy_free_fast( m_queryData ); } #endif - else - { - tracy_free_fast( m_queryData ); - AckSourceCodeNotAvailable(); - } - m_queryData = nullptr; - if( m_queryImage ) - { - tracy_free_fast( m_queryImage ); - m_queryImage = nullptr; - } + if( !ok ) AckSourceCodeNotAvailable(); + + tracy_free_fast( m_queryData ); + tracy_free_fast( m_queryImage ); + m_queryData = nullptr; + m_queryImage = nullptr; } #if defined _WIN32 && defined TRACY_TIMER_QPC