Preemptive message text delivery.

This commit is contained in:
Bartosz Taudul 2017-11-11 15:41:21 +01:00
parent 76e11174dc
commit 7f3b8f4647
5 changed files with 21 additions and 44 deletions

View File

@ -264,15 +264,19 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token )
for( size_t i=0; i<sz; i++ ) for( size_t i=0; i<sz; i++ )
{ {
const auto item = m_itemBuf + i; const auto item = m_itemBuf + i;
uint64_t ptr;
switch( item->hdr.type ) switch( item->hdr.type )
{ {
case QueueType::ZoneText: case QueueType::ZoneText:
{ ptr = item->zoneText.text;
const auto ptr = item->zoneText.text; SendString( ptr, (const char*)ptr, QueueType::CustomStringData );
tracy_free( (void*)ptr );
break;
case QueueType::Message:
ptr = item->message.text;
SendString( ptr, (const char*)ptr, QueueType::CustomStringData ); SendString( ptr, (const char*)ptr, QueueType::CustomStringData );
tracy_free( (void*)ptr ); tracy_free( (void*)ptr );
break; break;
}
default: default:
break; break;
} }
@ -322,7 +326,7 @@ bool Profiler::SendData( const char* data, size_t len )
bool Profiler::SendString( uint64_t str, const char* ptr, QueueType type ) bool Profiler::SendString( uint64_t str, const char* ptr, QueueType type )
{ {
assert( type == QueueType::StringData || type == QueueType::ThreadName || type == QueueType::CustomStringData || type == QueueType::PlotName || type == QueueType::MessageData ); assert( type == QueueType::StringData || type == QueueType::ThreadName || type == QueueType::CustomStringData || type == QueueType::PlotName );
QueueItem item; QueueItem item;
item.hdr.type = type; item.hdr.type = type;
@ -417,10 +421,6 @@ bool Profiler::HandleServerQuery()
case ServerQueryPlotName: case ServerQueryPlotName:
SendString( ptr, (const char*)ptr, QueueType::PlotName ); SendString( ptr, (const char*)ptr, QueueType::PlotName );
break; break;
case ServerQueryMessage:
SendString( ptr, (const char*)ptr, QueueType::MessageData );
tracy_free( (void*)ptr );
break;
case ServerQueryTerminate: case ServerQueryTerminate:
return false; return false;
default: default:

View File

@ -24,7 +24,6 @@ enum ServerQuery : uint8_t
ServerQuerySourceLocation, ServerQuerySourceLocation,
ServerQuerySourceLocationPayload, ServerQuerySourceLocationPayload,
ServerQueryPlotName, ServerQueryPlotName,
ServerQueryMessage,
}; };
enum { WelcomeMessageProgramNameSize = 64 }; enum { WelcomeMessageProgramNameSize = 64 };

View File

@ -28,7 +28,6 @@ enum class QueueType : uint8_t
PlotName, PlotName,
Message, Message,
MessageLiteral, MessageLiteral,
MessageData,
NUM_TYPES NUM_TYPES
}; };
@ -193,7 +192,6 @@ static const size_t QueueDataSize[] = {
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // plot name sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // plot name
sizeof( QueueHeader ) + sizeof( QueueMessage ), sizeof( QueueHeader ) + sizeof( QueueMessage ),
sizeof( QueueHeader ) + sizeof( QueueMessage ), // literal sizeof( QueueHeader ) + sizeof( QueueMessage ), // literal
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // message data
}; };
static_assert( QueueItemSize == 32, "Queue item size not 32 bytes" ); static_assert( QueueItemSize == 32, "Queue item size not 32 bytes" );

View File

@ -468,7 +468,7 @@ void View::Worker()
if( m_terminate ) if( m_terminate )
{ {
if( !m_pendingStrings.empty() || !m_pendingThreads.empty() || !m_pendingSourceLocation.empty() || if( !m_pendingStrings.empty() || !m_pendingThreads.empty() || !m_pendingSourceLocation.empty() ||
!m_pendingCustomStrings.empty() || !m_pendingPlots.empty() || !m_pendingMessages.empty() ) !m_pendingCustomStrings.empty() || !m_pendingPlots.empty() )
{ {
continue; continue;
} }
@ -496,7 +496,7 @@ close:
void View::DispatchProcess( const QueueItem& ev, char*& ptr ) void View::DispatchProcess( const QueueItem& ev, char*& ptr )
{ {
ptr += QueueDataSize[ev.hdr.idx]; ptr += QueueDataSize[ev.hdr.idx];
if( ev.hdr.type == QueueType::CustomStringData || ev.hdr.type == QueueType::StringData || ev.hdr.type == QueueType::ThreadName || ev.hdr.type == QueueType::PlotName || ev.hdr.type == QueueType::MessageData || ev.hdr.type == QueueType::SourceLocationPayload ) if( ev.hdr.type == QueueType::CustomStringData || ev.hdr.type == QueueType::StringData || ev.hdr.type == QueueType::ThreadName || ev.hdr.type == QueueType::PlotName || ev.hdr.type == QueueType::SourceLocationPayload )
{ {
uint16_t sz; uint16_t sz;
memcpy( &sz, ptr, sizeof( sz ) ); memcpy( &sz, ptr, sizeof( sz ) );
@ -515,9 +515,6 @@ void View::DispatchProcess( const QueueItem& ev, char*& ptr )
case QueueType::PlotName: case QueueType::PlotName:
HandlePlotName( ev.stringTransfer.ptr, ptr, sz ); HandlePlotName( ev.stringTransfer.ptr, ptr, sz );
break; break;
case QueueType::MessageData:
AddMessageData( ev.stringTransfer.ptr, ptr, sz );
break;
case QueueType::SourceLocationPayload: case QueueType::SourceLocationPayload:
AddSourceLocationPayload( ev.stringTransfer.ptr, ptr, sz ); AddSourceLocationPayload( ev.stringTransfer.ptr, ptr, sz );
break; break;
@ -669,7 +666,7 @@ void View::ProcessZoneText( const QueueZoneText& ev )
auto it = m_pendingCustomStrings.find( ev.text ); auto it = m_pendingCustomStrings.find( ev.text );
assert( it != m_pendingCustomStrings.end() ); assert( it != m_pendingCustomStrings.end() );
m_lock.lock(); m_lock.lock();
GetTextData( *zone )->userText = it->second; GetTextData( *zone )->userText = it->second.ptr;
m_lock.unlock(); m_lock.unlock();
m_pendingCustomStrings.erase( it ); m_pendingCustomStrings.erase( it );
} }
@ -807,8 +804,14 @@ void View::ProcessPlotData( const QueuePlotData& ev )
void View::ProcessMessage( const QueueMessage& ev ) void View::ProcessMessage( const QueueMessage& ev )
{ {
m_pendingMessages.emplace( ev.text, MessagePending { int64_t( ev.time * m_timerMul ), ev.thread } ); auto it = m_pendingCustomStrings.find( ev.text );
ServerQuery( ServerQueryMessage, ev.text ); assert( it != m_pendingCustomStrings.end() );
auto msg = m_slab.Alloc<MessageData>();
msg->time = int64_t( ev.time * m_timerMul );
msg->ref.isidx = true;
msg->ref.stridx = it->second.idx;
InsertMessageData( msg, ev.thread );
m_pendingCustomStrings.erase( it );
} }
void View::ProcessMessageLiteral( const QueueMessage& ev ) void View::ProcessMessageLiteral( const QueueMessage& ev )
@ -883,9 +886,8 @@ void View::AddThreadString( uint64_t id, char* str, size_t sz )
void View::AddCustomString( uint64_t ptr, char* str, size_t sz ) void View::AddCustomString( uint64_t ptr, char* str, size_t sz )
{ {
const auto sl = StoreString( str, sz );
assert( m_pendingCustomString.find( ptr ) == m_pendingCustomStrings.end() ); assert( m_pendingCustomString.find( ptr ) == m_pendingCustomStrings.end() );
m_pendingCustomStrings.emplace( ptr, sl.ptr ); m_pendingCustomStrings.emplace( ptr, StoreString( str, sz ) );
} }
View::StringLocation View::StoreString( char* str, size_t sz ) View::StringLocation View::StoreString( char* str, size_t sz )
@ -966,20 +968,6 @@ void View::AddSourceLocationPayload( uint64_t ptr, char* data, size_t sz )
m_pendingSourceLocationPayload.erase( pit ); m_pendingSourceLocationPayload.erase( pit );
} }
void View::AddMessageData( uint64_t ptr, char* str, size_t sz )
{
const auto sl = StoreString( str, sz );
auto it = m_pendingMessages.find( ptr );
assert( it != m_pendingMessages.end() );
auto msg = m_slab.Alloc<MessageData>();
msg->time = it->second.time;
msg->ref.isidx = true;
msg->ref.stridx = sl.idx;
InsertMessageData( msg, it->second.thread );
m_pendingMessages.erase( it );
}
uint32_t View::ShrinkSourceLocation( uint64_t srcloc ) uint32_t View::ShrinkSourceLocation( uint64_t srcloc )
{ {
auto it = m_sourceLocationShrink.find( srcloc ); auto it = m_sourceLocationShrink.find( srcloc );

View File

@ -46,12 +46,6 @@ private:
Short Short
}; };
struct MessagePending
{
int64_t time;
uint64_t thread;
};
struct MessageData struct MessageData
{ {
int64_t time; int64_t time;
@ -156,7 +150,6 @@ private:
void AddCustomString( uint64_t ptr, char* str, size_t sz ); void AddCustomString( uint64_t ptr, char* str, size_t sz );
void AddSourceLocation( const QueueSourceLocation& srcloc ); void AddSourceLocation( const QueueSourceLocation& srcloc );
void AddSourceLocationPayload( uint64_t ptr, char* data, size_t sz ); void AddSourceLocationPayload( uint64_t ptr, char* data, size_t sz );
void AddMessageData( uint64_t ptr, char* str, size_t sz );
StringLocation StoreString( char* str, size_t sz ); StringLocation StoreString( char* str, size_t sz );
@ -259,12 +252,11 @@ private:
std::unordered_set<uint64_t> m_pendingStrings; std::unordered_set<uint64_t> m_pendingStrings;
std::unordered_set<uint64_t> m_pendingThreads; std::unordered_set<uint64_t> m_pendingThreads;
std::unordered_set<uint64_t> m_pendingSourceLocation; std::unordered_set<uint64_t> m_pendingSourceLocation;
std::unordered_map<uint64_t, const char*> m_pendingCustomStrings; std::unordered_map<uint64_t, StringLocation> m_pendingCustomStrings;
std::unordered_map<uint64_t, uint32_t> m_threadMap; std::unordered_map<uint64_t, uint32_t> m_threadMap;
std::unordered_map<uint64_t, uint32_t> m_plotMap; std::unordered_map<uint64_t, uint32_t> m_plotMap;
std::unordered_map<const char*, uint32_t, charutil::Hasher, charutil::Comparator> m_plotRev; std::unordered_map<const char*, uint32_t, charutil::Hasher, charutil::Comparator> m_plotRev;
std::unordered_map<uint64_t, PlotData*> m_pendingPlots; std::unordered_map<uint64_t, PlotData*> m_pendingPlots;
std::unordered_map<uint64_t, MessagePending> m_pendingMessages;
std::unordered_map<uint64_t, uint32_t> m_sourceLocationShrink; std::unordered_map<uint64_t, uint32_t> m_sourceLocationShrink;
std::unordered_map<uint64_t, ZoneEvent*> m_pendingSourceLocationPayload; std::unordered_map<uint64_t, ZoneEvent*> m_pendingSourceLocationPayload;