diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 467656b5..eb5449db 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -3235,6 +3235,20 @@ void Worker::Exec() m_netWriteCv.notify_one(); } + if( m_serverQuerySpaceLeft > 0 && !m_serverQueryQueuePrio.empty() ) + { + const auto toSend = std::min( m_serverQuerySpaceLeft, m_serverQueryQueuePrio.size() ); + m_sock.Send( m_serverQueryQueuePrio.data(), toSend * ServerQueryPacketSize ); + m_serverQuerySpaceLeft -= toSend; + if( toSend == m_serverQueryQueuePrio.size() ) + { + m_serverQueryQueuePrio.clear(); + } + else + { + m_serverQueryQueuePrio.erase( m_serverQueryQueuePrio.begin(), m_serverQueryQueuePrio.begin() + toSend ); + } + } if( m_serverQuerySpaceLeft > 0 && !m_serverQueryQueue.empty() ) { const auto toSend = std::min( m_serverQuerySpaceLeft, m_serverQueryQueue.size() ); @@ -3265,7 +3279,7 @@ void Worker::Exec() if( m_pendingStrings != 0 || m_pendingThreads != 0 || m_pendingSourceLocation != 0 || m_pendingCallstackFrames != 0 || m_data.plots.IsPending() || m_pendingCallstackId != 0 || m_pendingExternalNames != 0 || m_pendingCallstackSubframes != 0 || m_pendingFrameImageData.image != nullptr || !m_pendingSymbols.empty() || - m_pendingSymbolCode != 0 || m_pendingCodeInformation != 0 || !m_serverQueryQueue.empty() || + m_pendingSymbolCode != 0 || m_pendingCodeInformation != 0 || !m_serverQueryQueue.empty() || !m_serverQueryQueuePrio.empty() || m_pendingSourceLocationPayload != 0 || m_pendingSingleString.ptr != nullptr || m_pendingSecondString.ptr != nullptr || !m_sourceCodeQuery.empty() || m_pendingFibers != 0 ) { @@ -3308,7 +3322,7 @@ void Worker::UpdateMbps( int64_t td ) m_mbpsData.mbps.emplace_back( bytes / ( td * 125.f ) ); } m_mbpsData.compRatio = decBytes == 0 ? 1 : float( bytes ) / decBytes; - m_mbpsData.queue = m_serverQueryQueue.size(); + m_mbpsData.queue = m_serverQueryQueue.size() + m_serverQueryQueuePrio.size(); m_mbpsData.transferred += bytes; } @@ -3363,6 +3377,20 @@ void Worker::HandleFailure( const char* ptr, const char* end ) m_netWriteCv.notify_one(); } + if( m_serverQuerySpaceLeft > 0 && !m_serverQueryQueuePrio.empty() ) + { + const auto toSend = std::min( m_serverQuerySpaceLeft, m_serverQueryQueuePrio.size() ); + m_sock.Send( m_serverQueryQueuePrio.data(), toSend * ServerQueryPacketSize ); + m_serverQuerySpaceLeft -= toSend; + if( toSend == m_serverQueryQueuePrio.size() ) + { + m_serverQueryQueuePrio.clear(); + } + else + { + m_serverQueryQueuePrio.erase( m_serverQueryQueuePrio.begin(), m_serverQueryQueuePrio.begin() + toSend ); + } + } if( m_serverQuerySpaceLeft > 0 && !m_serverQueryQueue.empty() ) { const auto toSend = std::min( m_serverQuerySpaceLeft, m_serverQueryQueue.size() ); @@ -3492,11 +3520,15 @@ void Worker::DispatchFailure( const QueueItem& ev, const char*& ptr ) void Worker::Query( ServerQuery type, uint64_t data, uint32_t extra ) { ServerQueryPacket query { type, data, extra }; - if( m_serverQuerySpaceLeft > 0 && m_serverQueryQueue.empty() ) + if( m_serverQuerySpaceLeft > 0 && m_serverQueryQueuePrio.empty() && m_serverQueryQueue.empty() ) { m_serverQuerySpaceLeft--; m_sock.Send( &query, ServerQueryPacketSize ); } + else if( IsQueryPrio( type ) ) + { + m_serverQueryQueuePrio.push_back( query ); + } else { m_serverQueryQueue.push_back( query ); diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index e99d696b..439bc458 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -1019,7 +1019,7 @@ private: PlotData* m_sysTimePlot = nullptr; - Vector m_serverQueryQueue; + Vector m_serverQueryQueue, m_serverQueryQueuePrio; size_t m_serverQuerySpaceLeft, m_serverQuerySpaceBase; unordered_flat_map m_frameImageStaging;