1
0
mirror of https://github.com/wolfpld/tracy.git synced 2025-03-20 07:40:02 +08:00

Terminate connection handshake.

This commit is contained in:
Bartosz Taudul 2017-10-18 18:48:51 +02:00
parent d942b7edf1
commit 7c47edc64f
6 changed files with 86 additions and 18 deletions

View File

@ -148,10 +148,10 @@ bool Profiler::ShouldExit()
return s_instance->m_shutdown.load( std::memory_order_relaxed ); return s_instance->m_shutdown.load( std::memory_order_relaxed );
} }
enum { BulkSize = TargetFrameSize / QueueItemSize };
void Profiler::Worker() void Profiler::Worker()
{ {
enum { BulkSize = TargetFrameSize / QueueItemSize };
const auto procname = GetProcessName(); const auto procname = GetProcessName();
const auto pnsz = std::min<size_t>( strlen( procname ), WelcomeMessageProgramNameSize - 1 ); const auto pnsz = std::min<size_t>( strlen( procname ), WelcomeMessageProgramNameSize - 1 );
@ -192,25 +192,14 @@ void Profiler::Worker()
for(;;) for(;;)
{ {
QueueItem item[BulkSize]; const auto status = Dequeue( token );
const auto sz = s_queue.try_dequeue_bulk( token, item, BulkSize ); if( status == ConnectionLost )
if( sz > 0 )
{ {
auto buf = m_buffer + m_bufferOffset; break;
auto ptr = buf;
for( size_t i=0; i<sz; i++ )
{
const auto dsz = QueueDataSize[item[i].hdr.idx];
memcpy( ptr, item+i, dsz );
ptr += dsz;
}
if( !SendData( buf, ptr - buf ) ) break;
m_bufferOffset += int( ptr - buf );
if( m_bufferOffset > TargetFrameSize * 2 ) m_bufferOffset = 0;
} }
else else if( status == QueueEmpty )
{ {
if( ShouldExit() ) return; if( ShouldExit() ) break;
std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) ); std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
} }
@ -219,7 +208,49 @@ void Profiler::Worker()
if( !HandleServerQuery() ) break; if( !HandleServerQuery() ) break;
} }
} }
if( ShouldExit() ) break;
} }
QueueItem terminate;
terminate.hdr.type = QueueType::Terminate;
if( !SendData( (const char*)&terminate, 1 ) ) return;
for(;;)
{
if( m_sock->HasData() )
{
while( m_sock->HasData() ) if( !HandleServerQuery() ) return;
while( Dequeue( token ) == Success ) {}
}
else
{
std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
}
}
}
Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token )
{
QueueItem item[BulkSize];
const auto sz = s_queue.try_dequeue_bulk( token, item, BulkSize );
if( sz > 0 )
{
auto buf = m_buffer + m_bufferOffset;
auto ptr = buf;
for( size_t i=0; i<sz; i++ )
{
const auto dsz = QueueDataSize[item[i].hdr.idx];
memcpy( ptr, item+i, dsz );
ptr += dsz;
}
if( !SendData( buf, ptr - buf ) ) return ConnectionLost;
m_bufferOffset += int( ptr - buf );
if( m_bufferOffset > TargetFrameSize * 2 ) m_bufferOffset = 0;
}
else
{
return QueueEmpty;
}
return Success;
} }
bool Profiler::SendData( const char* data, size_t len ) bool Profiler::SendData( const char* data, size_t len )
@ -322,6 +353,8 @@ bool Profiler::HandleServerQuery()
case ServerQueryMessageLiteral: case ServerQueryMessageLiteral:
SendString( ptr, (const char*)ptr, QueueType::MessageData ); SendString( ptr, (const char*)ptr, QueueType::MessageData );
break; break;
case ServerQueryTerminate:
return false;
default: default:
assert( false ); assert( false );
break; break;

View File

@ -162,9 +162,13 @@ public:
static bool ShouldExit(); static bool ShouldExit();
private: private:
enum DequeueStatus { Success, ConnectionLost, QueueEmpty };
static void LaunchWorker( void* ptr ) { ((Profiler*)ptr)->Worker(); } static void LaunchWorker( void* ptr ) { ((Profiler*)ptr)->Worker(); }
void Worker(); void Worker();
DequeueStatus Dequeue( moodycamel::ConsumerToken& token );
bool SendData( const char* data, size_t len ); bool SendData( const char* data, size_t len );
bool SendString( uint64_t ptr, const char* str, QueueType type ); bool SendString( uint64_t ptr, const char* str, QueueType type );
void SendSourceLocation( uint64_t ptr ); void SendSourceLocation( uint64_t ptr );

View File

@ -18,6 +18,7 @@ static_assert( TargetFrameSize * 2 >= 64 * 1024, "Not enough space for LZ4 strea
enum ServerQuery : uint8_t enum ServerQuery : uint8_t
{ {
ServerQueryTerminate,
ServerQueryString, ServerQueryString,
ServerQueryThreadString, ServerQueryThreadString,
ServerQueryCustomString, ServerQueryCustomString,

View File

@ -8,6 +8,7 @@ namespace tracy
enum class QueueType : uint8_t enum class QueueType : uint8_t
{ {
Terminate,
ZoneBegin, ZoneBegin,
ZoneEnd, ZoneEnd,
StringData, StringData,
@ -170,6 +171,7 @@ struct QueueItem
enum { QueueItemSize = sizeof( QueueItem ) }; enum { QueueItemSize = sizeof( QueueItem ) };
static const size_t QueueDataSize[] = { static const size_t QueueDataSize[] = {
sizeof( QueueHeader ), // terminate
sizeof( QueueHeader ) + sizeof( QueueZoneBegin ), sizeof( QueueHeader ) + sizeof( QueueZoneBegin ),
sizeof( QueueHeader ) + sizeof( QueueZoneEnd ), sizeof( QueueHeader ) + sizeof( QueueZoneEnd ),
sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // string data sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // string data

View File

@ -76,6 +76,7 @@ View::View( const char* addr )
, m_drawZones( true ) , m_drawZones( true )
, m_drawLocks( true ) , m_drawLocks( true )
, m_drawPlots( true ) , m_drawPlots( true )
, m_terminate( false )
{ {
assert( s_instance == nullptr ); assert( s_instance == nullptr );
s_instance = this; s_instance = this;
@ -109,6 +110,7 @@ View::View( FileRead& f )
, m_drawZones( true ) , m_drawZones( true )
, m_drawLocks( true ) , m_drawLocks( true )
, m_drawPlots( true ) , m_drawPlots( true )
, m_terminate( false )
{ {
assert( s_instance == nullptr ); assert( s_instance == nullptr );
s_instance = this; s_instance = this;
@ -384,6 +386,27 @@ void View::Worker()
t0 = t1; t0 = t1;
bytes = 0; bytes = 0;
} }
if( m_terminate )
{
if( !m_pendingStrings.empty() || !m_pendingThreads.empty() || !m_pendingSourceLocation.empty() ||
!m_pendingCustomStrings.empty() || !m_pendingPlots.empty() || !m_pendingMessages.empty() )
{
continue;
}
bool done = true;
for( auto& v : m_zoneStack )
{
if( !v.second.empty() )
{
done = false;
break;
}
}
if( !done ) continue;
ServerQuery( ServerQueryTerminate, 0 );
break;
}
} }
close: close:
@ -519,6 +542,9 @@ void View::Process( const QueueItem& ev )
case QueueType::MessageLiteral: case QueueType::MessageLiteral:
ProcessMessage( ev.message, true ); ProcessMessage( ev.message, true );
break; break;
case QueueType::Terminate:
m_terminate = true;
break;
default: default:
assert( false ); assert( false );
break; break;

View File

@ -247,6 +247,8 @@ private:
bool m_drawZones; bool m_drawZones;
bool m_drawLocks; bool m_drawLocks;
bool m_drawPlots; bool m_drawPlots;
bool m_terminate;
}; };
} }