diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 33cc0594..51414863 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -22,6 +22,7 @@ #include "../common/TracyProtocol.hpp" #include "../common/TracySystem.hpp" #include "TracyFileRead.hpp" +#include "TracyFilesystem.hpp" #include "TracyFileWrite.hpp" #include "TracySort.hpp" #include "TracyTaskDispatch.hpp" @@ -7299,4 +7300,28 @@ ZoneExtra& Worker::RequestZoneExtra( ZoneEvent& ev ) } } +void Worker::CacheSource( const StringRef& str ) +{ + assert( str.active ); + assert( m_checkedFileStrings.find( str ) == m_checkedFileStrings.end() ); + m_checkedFileStrings.emplace( str ); + auto file = GetString( str ); + if( SourceFileValid( file, GetCaptureTime() ) ) + { + // Possible duplication of pointer and index strings + if( m_data.sourceFileCache.find( file ) == m_data.sourceFileCache.end() ) + { + FILE* f = fopen( file, "rb" ); + fseek( f, 0, SEEK_END ); + const auto sz = ftell( f ); + fseek( f, 0, SEEK_SET ); + auto src = (char*)m_slab.AllocBig( sz+1 ); + fread( src, 1, sz, f ); + src[sz] = '\0'; + fclose( f ); + m_data.sourceFileCache.emplace( file, MemoryBlock{ src, uint32_t( sz+1 ) } ); + } + } +} + } diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index c5ab3c00..0aa76d55 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -304,6 +304,8 @@ private: unordered_flat_map codeAddressToLocation; unordered_flat_map> locationCodeAddressList; + + unordered_flat_map sourceFileCache; }; struct MbpsBlock @@ -714,6 +716,8 @@ private: StringLocation StoreString( const char* str, size_t sz ); const ContextSwitch* const GetContextSwitchDataImpl( uint64_t thread ); + void CacheSource( const StringRef& str ); + tracy_force_inline Vector>& GetZoneChildrenMutable( int32_t idx ) { return m_data.zoneChildren[idx]; } #ifndef TRACY_NO_STATISTICS tracy_force_inline Vector& GetGhostChildrenMutable( int32_t idx ) { return m_data.ghostChildren[idx]; } @@ -803,6 +807,8 @@ private: FrameImagePending m_pendingFrameImageData = {}; unordered_flat_map m_pendingSymbols; unordered_flat_set m_pendingSymbolCode; + unordered_flat_set m_pendingFileStrings; + unordered_flat_set m_checkedFileStrings; uint32_t m_pendingStrings; uint32_t m_pendingThreads;