1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-30 04:43:53 +00:00

Explicitly save context switch callstack samples.

This commit is contained in:
Bartosz Taudul 2021-12-21 15:24:11 +01:00
parent 67c2ffcb17
commit db64a5fa7e
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
2 changed files with 38 additions and 14 deletions

View File

@ -7,7 +7,7 @@ namespace Version
{ {
enum { Major = 0 }; enum { Major = 0 };
enum { Minor = 7 }; enum { Minor = 7 };
enum { Patch = 13 }; enum { Patch = 14 };
} }
} }

View File

@ -994,6 +994,30 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
{ {
f.Skip( msz * sizeof( uint64_t ) ); f.Skip( msz * sizeof( uint64_t ) );
} }
if( fileVer >= FileVersion( 0, 7, 14 ) )
{
uint64_t ssz;
f.Read( ssz );
if( ssz != 0 )
{
if( eventMask & EventType::Samples )
{
int64_t refTime = 0;
td->ctxSwitchSamples.reserve_exact( ssz, m_slab );
auto ptr = td->ctxSwitchSamples.data();
for( uint64_t j=0; j<ssz; j++ )
{
ptr->time.SetVal( ReadTimeOffset( f, refTime ) );
f.Read( &ptr->callstack, sizeof( ptr->callstack ) );
ptr++;
}
}
else
{
f.Skip( ssz * ( 8 + 3 ) );
}
}
}
if( fileVer >= FileVersion( 0, 6, 4 ) ) if( fileVer >= FileVersion( 0, 6, 4 ) )
{ {
uint64_t ssz; uint64_t ssz;
@ -1964,23 +1988,15 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
for( auto& t : m_data.threads ) for( auto& t : m_data.threads )
{ {
if( m_shutdown.load( std::memory_order_relaxed ) ) return; if( m_shutdown.load( std::memory_order_relaxed ) ) return;
auto ctx = GetContextSwitchData( t->id ); auto cit = t->ctxSwitchSamples.begin();
Vector<ContextSwitchData>::const_iterator cit = nullptr;
if( ctx ) cit = ctx->v.begin();
for( auto& sd : t->samples ) for( auto& sd : t->samples )
{ {
bool isCtxSwitch = false; bool isCtxSwitch = false;
if( ctx ) if( cit != t->ctxSwitchSamples.end() )
{ {
cit = std::lower_bound( cit, ctx->v.end(), sd.time.Val(), [] ( const auto& l, const auto& r ) { return (uint64_t)l.End() < (uint64_t)r; } ); const auto sdt = sd.time.Val();
if( cit != ctx->v.end() ) cit = std::lower_bound( cit, t->ctxSwitchSamples.end(), sdt, []( const auto& l, const auto& r ) { return (uint64_t)l.time.Val() < (uint64_t)r; } );
{ isCtxSwitch = cit != t->ctxSwitchSamples.end() && cit->time.Val() == sdt;
if( sd.time.Val() == cit->Start() )
{
isCtxSwitch = true;
t->ctxSwitchSamples.push_back( sd );
}
}
} }
if( !isCtxSwitch ) if( !isCtxSwitch )
{ {
@ -8027,6 +8043,14 @@ void Worker::Write( FileWrite& f, bool fiDict )
auto ptr = uint64_t( (MessageData*)v ); auto ptr = uint64_t( (MessageData*)v );
f.Write( &ptr, sizeof( ptr ) ); f.Write( &ptr, sizeof( ptr ) );
} }
sz = thread->ctxSwitchSamples.size();
f.Write( &sz, sizeof( sz ) );
refTime = 0;
for( auto& v : thread->ctxSwitchSamples )
{
WriteTimeOffset( f, refTime, v.time.Val() );
f.Write( &v.callstack, sizeof( v.callstack ) );
}
if( m_inconsistentSamples ) if( m_inconsistentSamples )
{ {
#ifdef NO_PARALLEL_SORT #ifdef NO_PARALLEL_SORT