1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-29 12:23:53 +00:00

Remove parent pointer from ZoneEvent.

This commit is contained in:
Bartosz Taudul 2017-10-22 16:15:27 +02:00
parent 56d2842e2e
commit 2e6350877d
3 changed files with 33 additions and 15 deletions

View File

@ -25,7 +25,6 @@ struct ZoneEvent
int8_t cpu_end; int8_t cpu_end;
TextData* text; TextData* text;
ZoneEvent* parent;
Vector<ZoneEvent*> child; Vector<ZoneEvent*> child;
}; };

View File

@ -244,7 +244,7 @@ View::View( FileRead& f )
{ {
auto td = m_slab.AllocInit<ThreadData>(); auto td = m_slab.AllocInit<ThreadData>();
f.Read( &td->id, sizeof( td->id ) ); f.Read( &td->id, sizeof( td->id ) );
ReadTimeline( f, td->timeline, nullptr, stringMap ); ReadTimeline( f, td->timeline, stringMap );
uint64_t msz; uint64_t msz;
f.Read( &msz, sizeof( msz ) ); f.Read( &msz, sizeof( msz ) );
td->messages.reserve( msz ); td->messages.reserve( msz );
@ -922,7 +922,7 @@ void View::NewZone( ZoneEvent* zone, uint64_t thread )
{ {
m_zonesCnt++; m_zonesCnt++;
Vector<ZoneEvent*>* timeline = &NoticeThread( thread )->timeline; Vector<ZoneEvent*>* timeline = &NoticeThread( thread )->timeline;
InsertZone( zone, nullptr, *timeline ); InsertZone( zone, *timeline );
} }
void View::UpdateZone( ZoneEvent* zone ) void View::UpdateZone( ZoneEvent* zone )
@ -931,26 +931,24 @@ void View::UpdateZone( ZoneEvent* zone )
assert( std::upper_bound( zone->child.begin(), zone->child.end(), zone->end, [] ( const auto& l, const auto& r ) { return l < r->start; } ) == zone->child.end() ); assert( std::upper_bound( zone->child.begin(), zone->child.end(), zone->end, [] ( const auto& l, const auto& r ) { return l < r->start; } ) == zone->child.end() );
} }
void View::InsertZone( ZoneEvent* zone, ZoneEvent* parent, Vector<ZoneEvent*>& vec ) void View::InsertZone( ZoneEvent* zone, Vector<ZoneEvent*>& vec )
{ {
if( !vec.empty() ) if( !vec.empty() )
{ {
const auto lastend = vec.back()->end; const auto lastend = vec.back()->end;
if( lastend != -1 && lastend <= zone->start ) if( lastend != -1 && lastend <= zone->start )
{ {
zone->parent = parent;
vec.push_back( zone ); vec.push_back( zone );
} }
else else
{ {
assert( std::upper_bound( vec.begin(), vec.end(), zone->start, [] ( const auto& l, const auto& r ) { return l < r->start; } ) == vec.end() ); assert( std::upper_bound( vec.begin(), vec.end(), zone->start, [] ( const auto& l, const auto& r ) { return l < r->start; } ) == vec.end() );
assert( vec.back()->end == -1 || vec.back()->end >= zone->end ); assert( vec.back()->end == -1 || vec.back()->end >= zone->end );
InsertZone( zone, vec.back(), vec.back()->child ); InsertZone( zone, vec.back()->child );
} }
} }
else else
{ {
zone->parent = parent;
vec.push_back( zone ); vec.push_back( zone );
} }
} }
@ -2671,9 +2669,10 @@ void View::DrawZoneInfoWindow()
ImGui::SameLine(); ImGui::SameLine();
if( ImGui::Button( "Go to parent" ) ) if( ImGui::Button( "Go to parent" ) )
{ {
if( ev.parent ) auto parent = GetZoneParent( ev );
if( parent )
{ {
m_zoneInfoWindow = ev.parent; m_zoneInfoWindow = parent;
} }
} }
@ -2935,6 +2934,27 @@ void View::ZoneTooltip( const ZoneEvent& ev )
ImGui::EndTooltip(); ImGui::EndTooltip();
} }
const ZoneEvent* View::GetZoneParent( const ZoneEvent& zone ) const
{
for( auto& thread : m_threads )
{
const ZoneEvent* parent = nullptr;
const Vector<ZoneEvent*>* timeline = &thread->timeline;
if( timeline->empty() ) continue;
for(;;)
{
auto it = std::upper_bound( timeline->begin(), timeline->end(), zone.start, [] ( const auto& l, const auto& r ) { return l < r->start; } );
if( it != timeline->begin() ) --it;
if( (*it)->start > zone.end ) break;
if( *it == &zone ) return parent;
if( (*it)->child.empty() ) break;
parent = *it;
timeline = &parent->child;
}
}
return nullptr;
}
TextData* View::GetTextData( ZoneEvent& zone ) TextData* View::GetTextData( ZoneEvent& zone )
{ {
if( !zone.text ) if( !zone.text )
@ -3099,7 +3119,7 @@ void View::WriteTimeline( FileWrite& f, const Vector<ZoneEvent*>& vec )
} }
} }
void View::ReadTimeline( FileRead& f, Vector<ZoneEvent*>& vec, ZoneEvent* parent, const std::unordered_map<uint64_t, const char*>& stringMap ) void View::ReadTimeline( FileRead& f, Vector<ZoneEvent*>& vec, const std::unordered_map<uint64_t, const char*>& stringMap )
{ {
uint64_t sz; uint64_t sz;
f.Read( &sz, sizeof( sz ) ); f.Read( &sz, sizeof( sz ) );
@ -3132,9 +3152,7 @@ void View::ReadTimeline( FileRead& f, Vector<ZoneEvent*>& vec, ZoneEvent* parent
zone->text = nullptr; zone->text = nullptr;
} }
zone->parent = parent; ReadTimeline( f, zone->child, stringMap );
ReadTimeline( f, zone->child, zone, stringMap );
} }
} }

View File

@ -153,7 +153,7 @@ private:
void NewZone( ZoneEvent* zone, uint64_t thread ); void NewZone( ZoneEvent* zone, uint64_t thread );
void UpdateZone( ZoneEvent* zone ); void UpdateZone( ZoneEvent* zone );
void InsertZone( ZoneEvent* zone, ZoneEvent* parent, Vector<ZoneEvent*>& vec ); void InsertZone( ZoneEvent* zone, Vector<ZoneEvent*>& vec );
void InsertLockEvent( LockMap& lockmap, LockEvent* lev, uint64_t thread ); void InsertLockEvent( LockMap& lockmap, LockEvent* lev, uint64_t thread );
void UpdateLockCount( LockMap& lockmap, size_t pos ); void UpdateLockCount( LockMap& lockmap, size_t pos );
@ -198,12 +198,13 @@ private:
void ZoomToZone( const ZoneEvent& ev ); void ZoomToZone( const ZoneEvent& ev );
void ZoneTooltip( const ZoneEvent& ev ); void ZoneTooltip( const ZoneEvent& ev );
const ZoneEvent* GetZoneParent( const ZoneEvent& zone ) const;
TextData* GetTextData( ZoneEvent& zone ); TextData* GetTextData( ZoneEvent& zone );
void Write( FileWrite& f ); void Write( FileWrite& f );
void WriteTimeline( FileWrite& f, const Vector<ZoneEvent*>& vec ); void WriteTimeline( FileWrite& f, const Vector<ZoneEvent*>& vec );
void ReadTimeline( FileRead& f, Vector<ZoneEvent*>& vec, ZoneEvent* parent, const std::unordered_map<uint64_t, const char*>& stringMap ); void ReadTimeline( FileRead& f, Vector<ZoneEvent*>& vec, const std::unordered_map<uint64_t, const char*>& stringMap );
std::string m_addr; std::string m_addr;