1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-29 12:23:53 +00:00

Send priority queries before other queued up queries.

This ensures that simple to handle yet important queries are answered in a
timely manner. Previously an onslaught of slow symbol-related queries could
block e.g. zone name resolving for a couple of minutes.
This commit is contained in:
Bartosz Taudul 2022-03-31 00:04:32 +02:00
parent 5ae9e791a5
commit 2b47c2a64e
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
2 changed files with 36 additions and 4 deletions

View File

@ -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 );

View File

@ -1019,7 +1019,7 @@ private:
PlotData* m_sysTimePlot = nullptr;
Vector<ServerQueryPacket> m_serverQueryQueue;
Vector<ServerQueryPacket> m_serverQueryQueue, m_serverQueryQueuePrio;
size_t m_serverQuerySpaceLeft, m_serverQuerySpaceBase;
unordered_flat_map<uint64_t, int32_t> m_frameImageStaging;