From 422229bf1a64ce406bca68cbf56a61d35f68aec8 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Fri, 3 Jan 2020 16:54:35 +0100 Subject: [PATCH] Use new dequeue interface. --- client/TracyLfq.hpp | 6 ++ client/TracyProfiler.cpp | 164 +++++++++++++++++++-------------------- client/TracyProfiler.hpp | 9 +-- 3 files changed, 92 insertions(+), 87 deletions(-) diff --git a/client/TracyLfq.hpp b/client/TracyLfq.hpp index c0122e44..16b0258d 100644 --- a/client/TracyLfq.hpp +++ b/client/TracyLfq.hpp @@ -312,6 +312,12 @@ public: prod->m_available.store( true ); } + tracy_force_inline size_t Dequeue( char* ptr, size_t sz, uint64_t& thread ) + { + return 0; + } + + LockFreeQueue( const LockFreeQueue& ) = delete; LockFreeQueue( LockFreeQueue&& ) = delete; diff --git a/client/TracyProfiler.cpp b/client/TracyProfiler.cpp index 94acbf05..fc824405 100644 --- a/client/TracyProfiler.cpp +++ b/client/TracyProfiler.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -997,7 +998,6 @@ TRACY_API LuaZoneState& GetLuaZoneState() { return s_luaZoneState; } # endif #endif -enum { BulkSize = TargetFrameSize / QueueItemSize }; Profiler::Profiler() : m_timeBegin( 0 ) @@ -1014,7 +1014,7 @@ Profiler::Profiler() , m_buffer( (char*)tracy_malloc( TargetFrameSize*3 ) ) , m_bufferOffset( 0 ) , m_bufferStart( 0 ) - , m_itemBuf( (QueueItem*)tracy_malloc( sizeof( QueueItem ) * BulkSize ) ) + , m_itemBuf( (char*)tracy_malloc( TargetFrameSize ) ) , m_lz4Buf( (char*)tracy_malloc( LZ4Size + sizeof( lz4sz_t ) ) ) , m_serialQueue( 1024*1024 ) , m_serialDequeue( 1024*1024 ) @@ -1200,8 +1200,7 @@ void Profiler::Worker() return; } - // !!! - //ClearQueues( token ); + ClearQueues(); } } @@ -1289,7 +1288,7 @@ void Profiler::Worker() #ifdef TRACY_ON_DEMAND const auto currentTime = GetTime(); - ClearQueues( token ); + ClearQueues(); m_connectionId.fetch_add( 1, std::memory_order_release ); m_isConnected.store( true, std::memory_order_release ); #endif @@ -1331,9 +1330,7 @@ void Profiler::Worker() for(;;) { ProcessSysTime(); - //!!! - //const auto status = Dequeue( token ); - const auto status = DequeueStatus::QueueEmpty; + const auto status = Dequeue(); const auto serialStatus = DequeueSerial(); if( status == DequeueStatus::ConnectionLost || serialStatus == DequeueStatus::ConnectionLost ) { @@ -1395,8 +1392,7 @@ void Profiler::Worker() return; } - // !!! - //ClearQueues( token ); + ClearQueues(); m_sock = listen.Accept(); if( m_sock ) @@ -1434,9 +1430,7 @@ void Profiler::Worker() // Client is exiting. Send items remaining in queues. for(;;) { - // !!! - //const auto status = Dequeue( token ); - const auto status = DequeueStatus::QueueEmpty; + const auto status = Dequeue(); const auto serialStatus = DequeueSerial(); if( status == DequeueStatus::ConnectionLost || serialStatus == DequeueStatus::ConnectionLost ) { @@ -1480,8 +1474,7 @@ void Profiler::Worker() return; } } - // !!! - //while( Dequeue( token ) == DequeueStatus::DataDequeued ) {} + while( Dequeue() == DequeueStatus::DataDequeued ) {} while( DequeueSerial() == DequeueStatus::DataDequeued ) {} if( m_bufferOffset != m_bufferStart ) { @@ -1620,20 +1613,35 @@ static void FreeAssociatedMemory( const QueueItem& item ) } } -// !!! -/* -void Profiler::ClearQueues( moodycamel::ConsumerToken& token ) +static void FreeBufferAssociatedMemory( const char* ptr, size_t sz ) +{ + const auto end = ptr + sz; + while( ptr < end ) + { + const auto type = MemRead( ptr ); + const auto itemsz = QueueDataSize[type]; + if( type < (int)QueueType::Terminate ) + { + QueueItem item; + memcpy( &item, ptr, itemsz ); + FreeAssociatedMemory( item ); + } + ptr += itemsz; + } +} + +void Profiler::ClearQueues() { for(;;) { - const auto sz = GetQueue().try_dequeue_bulk( token, m_itemBuf, BulkSize ); + uint64_t thread; + const auto sz = GetQueue().Dequeue( m_itemBuf, TargetFrameSize, thread ); if( sz == 0 ) break; - for( size_t i=0; i 0 ) { if( threadId != m_threadCtx ) @@ -1676,18 +1682,19 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) } auto end = m_itemBuf + sz; - auto item = m_itemBuf; - while( item != end ) + auto data = m_itemBuf; + while( data < end ) { uint64_t ptr; - const auto idx = MemRead( &item->hdr.idx ); + const auto idx = MemRead( data ); + const auto itemsz = QueueDataSize[idx]; if( idx < (int)QueueType::Terminate ) { switch( (QueueType)idx ) { case QueueType::ZoneText: case QueueType::ZoneName: - ptr = MemRead( &item->zoneText.text ); + ptr = MemRead( data + offsetof( QueueItem, zoneText.text ) ); SendString( ptr, (const char*)ptr, QueueType::CustomStringData ); tracy_free( (void*)ptr ); break; @@ -1695,12 +1702,12 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) case QueueType::MessageColor: case QueueType::MessageCallstack: case QueueType::MessageColorCallstack: - ptr = MemRead( &item->message.text ); + ptr = MemRead( data + offsetof( QueueItem, message.text ) ); SendString( ptr, (const char*)ptr, QueueType::CustomStringData ); tracy_free( (void*)ptr ); break; case QueueType::MessageAppInfo: - ptr = MemRead( &item->message.text ); + ptr = MemRead( data + offsetof( QueueItem, message.text ) ); SendString( ptr, (const char*)ptr, QueueType::CustomStringData ); #ifndef TRACY_ON_DEMAND tracy_free( (void*)ptr ); @@ -1709,37 +1716,37 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) case QueueType::ZoneBeginAllocSrcLoc: case QueueType::ZoneBeginAllocSrcLocCallstack: { - int64_t t = MemRead( &item->zoneBegin.time ); + int64_t t = MemRead( data + offsetof( QueueItem, zoneBegin.time ) ); int64_t dt = t - m_refTimeThread; m_refTimeThread = t; - MemWrite( &item->zoneBegin.time, dt ); - ptr = MemRead( &item->zoneBegin.srcloc ); + MemWrite( data + offsetof( QueueItem, zoneBegin.time ), dt ); + ptr = MemRead( data + offsetof( QueueItem, zoneBegin.srcloc ) ); SendSourceLocationPayload( ptr ); tracy_free( (void*)ptr ); break; } case QueueType::Callstack: - ptr = MemRead( &item->callstack.ptr ); + ptr = MemRead( data + offsetof( QueueItem, callstack.ptr ) ); SendCallstackPayload( ptr ); tracy_free( (void*)ptr ); break; case QueueType::CallstackAlloc: - ptr = MemRead( &item->callstackAlloc.nativePtr ); + ptr = MemRead( data + offsetof( QueueItem, callstackAlloc.nativePtr ) ); if( ptr != 0 ) { CutCallstack( (void*)ptr, "lua_pcall" ); SendCallstackPayload( ptr ); tracy_free( (void*)ptr ); } - ptr = MemRead( &item->callstackAlloc.ptr ); + ptr = MemRead( data + offsetof( QueueItem, callstackAlloc.ptr ) ); SendCallstackAlloc( ptr ); tracy_free( (void*)ptr ); break; case QueueType::FrameImage: { - ptr = MemRead( &item->frameImage.image ); - const auto w = MemRead( &item->frameImage.w ); - const auto h = MemRead( &item->frameImage.h ); + ptr = MemRead( data + offsetof( QueueItem, frameImage.image ) ); + const auto w = MemRead( data + offsetof( QueueItem, frameImage.w ) ); + const auto h = MemRead( data + offsetof( QueueItem, frameImage.h ) ); const auto csz = size_t( w * h / 2 ); SendLongString( ptr, (const char*)ptr, csz, QueueType::FrameImageData ); tracy_free( (void*)ptr ); @@ -1748,67 +1755,67 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) case QueueType::ZoneBegin: case QueueType::ZoneBeginCallstack: { - int64_t t = MemRead( &item->zoneBegin.time ); + int64_t t = MemRead( data + offsetof( QueueItem, zoneBegin.time ) ); int64_t dt = t - m_refTimeThread; m_refTimeThread = t; - MemWrite( &item->zoneBegin.time, dt ); + MemWrite( data + offsetof( QueueItem, zoneBegin.time ), dt ); break; } case QueueType::ZoneEnd: { - int64_t t = MemRead( &item->zoneEnd.time ); + int64_t t = MemRead( data + offsetof( QueueItem, zoneEnd.time ) ); int64_t dt = t - m_refTimeThread; m_refTimeThread = t; - MemWrite( &item->zoneEnd.time, dt ); + MemWrite( data + offsetof( QueueItem, zoneEnd.time ), dt ); break; } case QueueType::GpuZoneBegin: case QueueType::GpuZoneBeginCallstack: { - int64_t t = MemRead( &item->gpuZoneBegin.cpuTime ); + int64_t t = MemRead( data + offsetof( QueueItem, gpuZoneBegin.cpuTime ) ); int64_t dt = t - m_refTimeThread; m_refTimeThread = t; - MemWrite( &item->gpuZoneBegin.cpuTime, dt ); + MemWrite( data + offsetof( QueueItem, gpuZoneBegin.cpuTime ), dt ); break; } case QueueType::GpuZoneEnd: { - int64_t t = MemRead( &item->gpuZoneEnd.cpuTime ); + int64_t t = MemRead( data + offsetof( QueueItem, gpuZoneEnd.cpuTime ) ); int64_t dt = t - m_refTimeThread; m_refTimeThread = t; - MemWrite( &item->gpuZoneEnd.cpuTime, dt ); + MemWrite( data + offsetof( QueueItem, gpuZoneEnd.cpuTime ), dt ); break; } case QueueType::PlotData: { - int64_t t = MemRead( &item->plotData.time ); + int64_t t = MemRead( data + offsetof( QueueItem, plotData.time ) ); int64_t dt = t - m_refTimeThread; m_refTimeThread = t; - MemWrite( &item->plotData.time, dt ); + MemWrite( data + offsetof( QueueItem, plotData.time ), dt ); break; } case QueueType::ContextSwitch: { - int64_t t = MemRead( &item->contextSwitch.time ); + int64_t t = MemRead( data + offsetof( QueueItem, contextSwitch.time ) ); int64_t dt = t - m_refTimeCtx; m_refTimeCtx = t; - MemWrite( &item->contextSwitch.time, dt ); + MemWrite( data + offsetof( QueueItem, contextSwitch.time ), dt ); break; } case QueueType::ThreadWakeup: { - int64_t t = MemRead( &item->threadWakeup.time ); + int64_t t = MemRead( data + offsetof( QueueItem, threadWakeup.time ) ); int64_t dt = t - m_refTimeCtx; m_refTimeCtx = t; - MemWrite( &item->threadWakeup.time, dt ); + MemWrite( data + offsetof( QueueItem, threadWakeup.time ), dt ); break; } case QueueType::GpuTime: { - int64_t t = MemRead( &item->gpuTime.gpuTime ); + int64_t t = MemRead( data + offsetof( QueueItem, gpuTime.gpuTime ) ); int64_t dt = t - m_refTimeGpu; m_refTimeGpu = t; - MemWrite( &item->gpuTime.gpuTime, dt ); + MemWrite( data + offsetof( QueueItem, gpuTime.gpuTime ), dt ); break; } default: @@ -1816,8 +1823,8 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) break; } } - if( !AppendData( item, QueueDataSize[idx] ) ) return DequeueStatus::ConnectionLost; - item++; + if( !AppendData( data, itemsz ) ) return DequeueStatus::ConnectionLost; + data += itemsz; } } else @@ -1826,24 +1833,23 @@ Profiler::DequeueStatus Profiler::Dequeue( moodycamel::ConsumerToken& token ) } return DequeueStatus::DataDequeued; } -*/ -// !!! -/* -Profiler::DequeueStatus Profiler::DequeueContextSwitches( tracy::moodycamel::ConsumerToken& token, int64_t& timeStop ) +Profiler::DequeueStatus Profiler::DequeueContextSwitches( int64_t& timeStop ) { - const auto sz = GetQueue().try_dequeue_bulk( token, m_itemBuf, BulkSize ); + uint64_t threadId; + const auto sz = GetQueue().Dequeue( m_itemBuf, TargetFrameSize, threadId ); if( sz > 0 ) { auto end = m_itemBuf + sz; - auto item = m_itemBuf; - while( item != end ) + auto data = m_itemBuf; + while( data < end ) { - FreeAssociatedMemory( *item ); - const auto idx = MemRead( &item->hdr.idx ); + const auto idx = MemRead( data ); + const auto itemsz = QueueDataSize[idx]; + FreeBufferAssociatedMemory( data, itemsz ); if( idx == (uint8_t)QueueType::ContextSwitch ) { - const auto csTime = MemRead( &item->contextSwitch.time ); + const auto csTime = MemRead( data + offsetof( QueueItem, contextSwitch.time ) ); if( csTime > timeStop ) { timeStop = -1; @@ -1851,12 +1857,12 @@ Profiler::DequeueStatus Profiler::DequeueContextSwitches( tracy::moodycamel::Con } int64_t dt = csTime - m_refTimeCtx; m_refTimeCtx = csTime; - MemWrite( &item->contextSwitch.time, dt ); - if( !AppendData( item, QueueDataSize[(int)QueueType::ContextSwitch] ) ) return DequeueStatus::ConnectionLost; + MemWrite( data + offsetof( QueueItem, contextSwitch.time ), dt ); + if( !AppendData( data, itemsz ) ) return DequeueStatus::ConnectionLost; } else if( idx == (uint8_t)QueueType::ThreadWakeup ) { - const auto csTime = MemRead( &item->threadWakeup.time ); + const auto csTime = MemRead( data + offsetof( QueueItem, threadWakeup.time ) ); if( csTime > timeStop ) { timeStop = -1; @@ -1864,10 +1870,10 @@ Profiler::DequeueStatus Profiler::DequeueContextSwitches( tracy::moodycamel::Con } int64_t dt = csTime - m_refTimeCtx; m_refTimeCtx = csTime; - MemWrite( &item->threadWakeup.time, dt ); - if( !AppendData( item, QueueDataSize[(int)QueueType::ThreadWakeup] ) ) return DequeueStatus::ConnectionLost; + MemWrite( data + offsetof( QueueItem, threadWakeup.time ), dt ); + if( !AppendData( data, itemsz ) ) return DequeueStatus::ConnectionLost; } - item++; + data += itemsz; } } else @@ -1876,7 +1882,6 @@ Profiler::DequeueStatus Profiler::DequeueContextSwitches( tracy::moodycamel::Con } return DequeueStatus::DataDequeued; } -*/ Profiler::DequeueStatus Profiler::DequeueSerial() { @@ -2260,17 +2265,13 @@ bool Profiler::HandleServerQuery() void Profiler::HandleDisconnect() { - // !!! - /* - moodycamel::ConsumerToken token( GetQueue() ); - #ifdef TRACY_HAS_SYSTEM_TRACING if( s_sysTraceThread ) { auto timestamp = GetTime(); for(;;) { - const auto status = DequeueContextSwitches( token, timestamp ); + const auto status = DequeueContextSwitches( timestamp ); if( status == DequeueStatus::ConnectionLost ) { return; @@ -2319,7 +2320,7 @@ void Profiler::HandleDisconnect() if( !SendData( (const char*)&terminate, 1 ) ) return; for(;;) { - ClearQueues( token ); + ClearQueues(); if( m_sock->HasData() ) { while( m_sock->HasData() ) @@ -2340,7 +2341,6 @@ void Profiler::HandleDisconnect() std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) ); } } - */ } void Profiler::CalibrateTimer() diff --git a/client/TracyProfiler.hpp b/client/TracyProfiler.hpp index 6df16508..000bda19 100644 --- a/client/TracyProfiler.hpp +++ b/client/TracyProfiler.hpp @@ -480,11 +480,10 @@ private: static void LaunchCompressWorker( void* ptr ) { ((Profiler*)ptr)->CompressWorker(); } void CompressWorker(); - // !!! - //void ClearQueues( tracy::moodycamel::ConsumerToken& token ); + void ClearQueues(); void ClearSerial(); - //DequeueStatus Dequeue( tracy::moodycamel::ConsumerToken& token ); - //DequeueStatus DequeueContextSwitches( tracy::moodycamel::ConsumerToken& token, int64_t& timeStop ); + DequeueStatus Dequeue(); + DequeueStatus DequeueContextSwitches( int64_t& timeStop ); DequeueStatus DequeueSerial(); bool AppendData( const void* data, size_t len ); bool CommitData(); @@ -581,7 +580,7 @@ private: int m_bufferOffset; int m_bufferStart; - QueueItem* m_itemBuf; + char* m_itemBuf; char* m_lz4Buf; FastVector m_serialQueue, m_serialDequeue;