diff --git a/server/TracyVector.hpp b/server/TracyVector.hpp index 2908992b..d63fe2ec 100644 --- a/server/TracyVector.hpp +++ b/server/TracyVector.hpp @@ -170,6 +170,11 @@ public: void reserve( size_t cap ) { if( cap == 0 || cap <= Capacity() ) return; + reserve_non_zero( cap ); + } + + void reserve_non_zero( size_t cap ) + { cap--; cap |= cap >> 1; cap |= cap >> 2; diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 00699f86..776d6e69 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -1549,11 +1549,29 @@ void Worker::ReadTimeline( FileRead& f, Vector& vec ) { uint64_t sz; f.Read( &sz, sizeof( sz ) ); - vec.reserve( sz ); + if( sz != 0 ) + { + ReadTimeline( f, vec, sz ); + } +} - m_data.zonesCnt += sz; +void Worker::ReadTimeline( FileRead& f, Vector& vec ) +{ + uint64_t sz; + f.Read( &sz, sizeof( sz ) ); + if( sz != 0 ) + { + ReadTimeline( f, vec, sz ); + } +} - for( uint64_t i=0; i& vec, uint64_t size ) +{ + assert( size != 0 ); + vec.reserve_non_zero( size ); + m_data.zonesCnt += size; + + for( uint64_t i=0; i(); vec.push_back_no_space_check( zone ); @@ -1563,13 +1581,12 @@ void Worker::ReadTimeline( FileRead& f, Vector& vec ) } } -void Worker::ReadTimeline( FileRead& f, Vector& vec ) +void Worker::ReadTimeline( FileRead& f, Vector& vec, uint64_t size ) { - uint64_t sz; - f.Read( &sz, sizeof( sz ) ); - vec.reserve( sz ); + assert( size != 0 ); + vec.reserve_non_zero( size ); - for( uint64_t i=0; i(); vec.push_back_no_space_check( zone ); diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index fcaf6ee5..44dcfb0e 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -171,8 +171,11 @@ private: StringLocation StoreString( char* str, size_t sz ); - void ReadTimeline( FileRead& f, Vector& vec ); - void ReadTimeline( FileRead& f, Vector& vec ); + tracy_force_inline void ReadTimeline( FileRead& f, Vector& vec ); + tracy_force_inline void ReadTimeline( FileRead& f, Vector& vec ); + + void ReadTimeline( FileRead& f, Vector& vec, uint64_t size ); + void ReadTimeline( FileRead& f, Vector& vec, uint64_t size ); void WriteTimeline( FileWrite& f, const Vector& vec ); void WriteTimeline( FileWrite& f, const Vector& vec );