diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index c5a7d200..c4625935 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -213,11 +214,12 @@ void Profiler::Worker() for(;;) { const auto status = Dequeue( token ); - if( status == ConnectionLost ) + const auto serialStatus = DequeueSerial(); + if( status == ConnectionLost || serialStatus == ConnectionLost ) { break; } - else if( status == QueueEmpty ) + else if( status == QueueEmpty && serialStatus == QueueEmpty ) { if( ShouldExit() ) break; if( m_bufferOffset != m_bufferStart ) CommitData(); @@ -235,11 +237,12 @@ void Profiler::Worker() for(;;) { const auto status = Dequeue( token ); - if( status == ConnectionLost ) + const auto serialStatus = DequeueSerial(); + if( status == ConnectionLost || serialStatus == ConnectionLost ) { break; } - else if( status == QueueEmpty ) + else if( status == QueueEmpty && serialStatus == QueueEmpty ) { if( m_bufferOffset != m_bufferStart ) CommitData(); break; @@ -267,6 +270,7 @@ void Profiler::Worker() } } while( Dequeue( token ) == Success ) {} + while( DequeueSerial() == Success ) {} if( m_bufferOffset != m_bufferStart ) { if( !CommitData() ) return; @@ -326,6 +330,29 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) return Success; } +Profiler::DequeueStatus Profiler::DequeueSerial() +{ + std::lock_guard lock( m_serialLock ); + const auto sz = m_serialQueue.size(); + if( sz > 0 ) + { + auto item = m_serialQueue.data(); + auto end = item + sz; + while( item != end ) + { + const auto idx = MemRead( &item->hdr.idx ); + if( !AppendData( item, QueueDataSize[idx] ) ) return ConnectionLost; + item++; + } + m_serialQueue.clear(); + } + else + { + return QueueEmpty; + } + return Success; +} + bool Profiler::AppendData( const void* data, size_t len ) { auto ret = true; diff --git a/client/TracyProfiler.hpp b/client/TracyProfiler.hpp index eb8b7057..0c420548 100644 --- a/client/TracyProfiler.hpp +++ b/client/TracyProfiler.hpp @@ -229,6 +229,7 @@ private: void Worker(); DequeueStatus Dequeue( moodycamel::ConsumerToken& token ); + DequeueStatus DequeueSerial(); bool AppendData( const void* data, size_t len ); bool CommitData(); bool NeedDataSize( size_t len );