diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index 8d998950..2406150c 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -407,14 +407,55 @@ void Profiler::Worker() } } +static void FreeAssociatedMemory( const QueueItem& item ) +{ + if( item.hdr.idx >= (int)QueueType::Terminate ) return; + + uint64_t ptr; + switch( item.hdr.type ) + { + case QueueType::ZoneText: + case QueueType::ZoneName: + ptr = MemRead( &item.zoneText.text ); + tracy_free( (void*)ptr ); + break; + case QueueType::Message: + ptr = MemRead( &item.message.text ); + tracy_free( (void*)ptr ); + break; + case QueueType::ZoneBeginAllocSrcLoc: + ptr = MemRead( &item.zoneBegin.srcloc ); + tracy_free( (void*)ptr ); + break; + case QueueType::CallstackMemory: + ptr = MemRead( &item.callstackMemory.ptr ); + tracy_free( (void*)ptr ); + break; + case QueueType::Callstack: + ptr = MemRead( &item.callstack.ptr ); + tracy_free( (void*)ptr ); + break; + default: + assert( false ); + break; + } +} + void Profiler::ClearQueues( moodycamel::ConsumerToken& token ) { - // TODO analyse dropped items and free associated memory - - while( s_queue.try_dequeue_bulk( token, m_itemBuf, BulkSize ) > 0 ) {} + for(;;) + { + const auto sz = s_queue.try_dequeue_bulk( token, m_itemBuf, BulkSize ); + if( sz == 0 ) break; + for( size_t i=0; i lock( m_serialLock ); + + for( auto& v : m_serialDequeue ) FreeAssociatedMemory( v ); m_serialDequeue.clear(); + + for( auto& v : m_serialQueue ) FreeAssociatedMemory( v ); m_serialQueue.clear(); }