diff --git a/server/TracyEvent.hpp b/server/TracyEvent.hpp index 1e5cb831..f51610c1 100644 --- a/server/TracyEvent.hpp +++ b/server/TracyEvent.hpp @@ -442,6 +442,13 @@ struct CpuData Vector cs; }; +struct CpuThreadData +{ + int64_t runningTime = 0; + uint32_t runningRegions = 0; + uint32_t migrations = 0; +}; + } #endif diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 3d879540..e317cbe5 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -4138,7 +4138,16 @@ void Worker::ProcessContextSwitch( const QueueContextSwitch& ev ) item.SetReason( ev.reason ); item.SetState( ev.state ); - it->second->runningTime += time - item.Start(); + const auto dt = time - item.Start(); + it->second->runningTime += dt; + + auto tdit = m_data.cpuThreadData.find( ev.oldThread ); + if( tdit == m_data.cpuThreadData.end() ) + { + tdit = m_data.cpuThreadData.emplace( ev.oldThread, CpuThreadData {} ).first; + } + tdit->second.runningRegions++; + tdit->second.runningTime += dt; } if( !cs.empty() ) { @@ -4157,13 +4166,22 @@ void Worker::ProcessContextSwitch( const QueueContextSwitch& ev ) } auto& data = it->second->v; ContextSwitchData* item = nullptr; + bool migration = false; if( !data.empty() && data.back().Reason() == ContextSwitchData::Wakeup ) { item = &data.back(); + if( data.size() > 1 ) + { + migration = data[data.size()-2].Cpu() != ev.cpu; + } } else { assert( data.empty() || (uint64_t)data.back().End() <= time ); + if( !data.empty() ) + { + migration = data.back().Cpu() != ev.cpu; + } item = &data.push_next(); item->wakeup = time; } @@ -4183,6 +4201,16 @@ void Worker::ProcessContextSwitch( const QueueContextSwitch& ev ) { CheckExternalName( ev.newThread ); } + + if( migration ) + { + auto tdit = m_data.cpuThreadData.find( ev.newThread ); + if( tdit == m_data.cpuThreadData.end() ) + { + tdit = m_data.cpuThreadData.emplace( ev.newThread, CpuThreadData {} ).first; + } + tdit->second.migrations++; + } } } diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index 7fbe2dc9..46735f2b 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -213,6 +213,7 @@ private: CpuData cpuData[256]; flat_hash_map> tidToPid; + flat_hash_map> cpuThreadData; }; struct MbpsBlock