From ae33aa4869ef4bd2c54ba05128445761d4f17b06 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sun, 10 Nov 2019 21:35:41 +0100 Subject: [PATCH] Fitted zone vectors are now magic vectors. The pointed-to zones in the original children vector can't be freed, so they are put into a zone pool for re-use by future zones. --- server/TracyWorker.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index f542fff4..71b8da11 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -3647,8 +3647,16 @@ void Worker::ProcessZoneEnd( const QueueZoneEnd& ev ) if( sz <= 8 * 1024 ) { Vector> fitVec; - fitVec.reserve_exact( sz, m_slab ); - memcpy( fitVec.data(), childVec.data(), sz * sizeof( short_ptr ) ); + fitVec.set_magic(); + auto& fv = *((Vector*)&fitVec); + fv.reserve_exact( sz, m_slab ); + auto dst = fv.data(); + for( auto& ze : childVec ) + { + ZoneEvent* src = ze; + memcpy( dst++, src, sizeof( ZoneEvent ) ); + m_zoneEventPool.push_back( src ); + } fitVec.swap( childVec ); m_data.zoneVectorCache.push_back( std::move( fitVec ) ); }