From b52c43b9337680472c46f3cc3d377a9e46465120 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Mon, 18 Sep 2023 18:02:41 -0700 Subject: [PATCH] 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 --- eeschema/connection_graph.cpp | 19 +++++++++++++------ eeschema/sch_item.cpp | 5 +++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/eeschema/connection_graph.cpp b/eeschema/connection_graph.cpp index 37d41b9320..fe3dd09944 100644 --- a/eeschema/connection_graph.cpp +++ b/eeschema/connection_graph.cpp @@ -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& 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& aSubgrap for( CONNECTION_SUBGRAPH* sg : aSubgraphs ) { sg->m_code = -1; + sg->m_graph = nullptr; delete sg; } } diff --git a/eeschema/sch_item.cpp b/eeschema/sch_item.cpp index 1dfe0a271d..d1116aee71 100644 --- a/eeschema/sch_item.cpp +++ b/eeschema/sch_item.cpp @@ -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 ); + } }