Fix some stale pointers in incremental updates

Shared pointers contained stale references to the temporary graph.  When
merging, we need to ensure all references are updated to the final graph
This commit is contained in:
Seth Hillbrand 2023-09-18 18:02:41 -07:00
parent 22b733209d
commit b52c43b933
2 changed files with 18 additions and 6 deletions

View File

@ -521,7 +521,12 @@ void CONNECTION_GRAPH::Merge( CONNECTION_GRAPH& aGraph )
std::back_inserter( m_subgraphs ) );
for( CONNECTION_SUBGRAPH* sg : aGraph.m_subgraphs )
{
if( sg->m_driver_connection )
sg->m_driver_connection->SetGraph( this );
sg->m_graph = this;
}
std::copy( aGraph.m_driver_subgraphs.begin(),
aGraph.m_driver_subgraphs.end(),
@ -558,6 +563,7 @@ void CONNECTION_GRAPH::Merge( CONNECTION_GRAPH& aGraph )
m_last_bus_code = std::max( m_last_bus_code, aGraph.m_last_bus_code );
m_last_net_code = std::max( m_last_net_code, aGraph.m_last_net_code );
m_last_subgraph_code = std::max( m_last_subgraph_code, aGraph.m_last_subgraph_code );
}
@ -775,23 +781,23 @@ void CONNECTION_GRAPH::removeSubgraphs( std::set<CONNECTION_SUBGRAPH*>& aSubgrap
{
auto it = std::lower_bound( m_driver_subgraphs.begin(), m_driver_subgraphs.end(), sg );
if( it != m_driver_subgraphs.end() )
m_driver_subgraphs.erase( it );
while( it != m_driver_subgraphs.end() && *it == sg )
it = m_driver_subgraphs.erase( it );
}
{
auto it = std::lower_bound( m_subgraphs.begin(), m_subgraphs.end(), sg );
if( it != m_subgraphs.end() )
m_subgraphs.erase( it );
while( it != m_subgraphs.end() && *it == sg )
it = m_subgraphs.erase( it );
}
for( auto& el : m_sheet_to_subgraphs_map )
{
auto it = std::lower_bound( el.second.begin(), el.second.end(), sg );
if( it != el.second.end() )
el.second.erase( it );
while( it != el.second.end() && *it == sg )
it = el.second.erase( it );
}
auto remove_sg = [sg]( auto it ) -> bool
@ -870,6 +876,7 @@ void CONNECTION_GRAPH::removeSubgraphs( std::set<CONNECTION_SUBGRAPH*>& aSubgrap
for( CONNECTION_SUBGRAPH* sg : aSubgraphs )
{
sg->m_code = -1;
sg->m_graph = nullptr;
delete sg;
}
}

View File

@ -170,7 +170,12 @@ SCH_CONNECTION* SCH_ITEM::Connection( const SCH_SHEET_PATH* aSheet ) const
void SCH_ITEM::SetConnectionGraph( CONNECTION_GRAPH* aGraph )
{
for( auto& [path, conn] : m_connection_map )
{
conn->SetGraph( aGraph );
for( auto& member : conn->AllMembers() )
member->SetGraph( aGraph );
}
}