From d93bb464bf09498bf87498953c3b3046cf4e2645 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Wed, 1 Nov 2023 12:47:42 +0000 Subject: [PATCH] When garbage collecting locally we also need to clear global references. --- pcbnew/connectivity/connectivity_algo.cpp | 14 ++++++++++++-- pcbnew/connectivity/connectivity_algo.h | 18 ++++++++++++++---- pcbnew/connectivity/connectivity_data.cpp | 18 +++++++++++------- pcbnew/connectivity/connectivity_data.h | 8 +++++--- pcbnew/router/router_tool.cpp | 3 ++- pcbnew/tools/board_inspection_tool.cpp | 2 +- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/pcbnew/connectivity/connectivity_algo.cpp b/pcbnew/connectivity/connectivity_algo.cpp index b911782c68..42b666d37f 100644 --- a/pcbnew/connectivity/connectivity_algo.cpp +++ b/pcbnew/connectivity/connectivity_algo.cpp @@ -223,6 +223,12 @@ void CN_CONNECTIVITY_ALGO::searchConnections() m_itemList.RemoveInvalidItems( garbage ); + if( m_isLocal ) + { + for( CN_ITEM* item : m_globalConnectivity->m_itemList ) + item->RemoveInvalidRefs(); + } + for( CN_ITEM* item : garbage ) delete item; @@ -553,9 +559,13 @@ void CN_CONNECTIVITY_ALGO::Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter ) } -void CN_CONNECTIVITY_ALGO::LocalBuild( const std::vector& aItems ) +void CN_CONNECTIVITY_ALGO::LocalBuild( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems ) { - for( BOARD_ITEM* item : aItems ) + m_isLocal = true; + m_globalConnectivity = aGlobalConnectivity; + + for( BOARD_ITEM* item : aLocalItems ) { switch( item->Type() ) { diff --git a/pcbnew/connectivity/connectivity_algo.h b/pcbnew/connectivity/connectivity_algo.h index f3b572106f..09b4b39350 100644 --- a/pcbnew/connectivity/connectivity_algo.h +++ b/pcbnew/connectivity/connectivity_algo.h @@ -158,8 +158,14 @@ public: std::list m_items; }; - CN_CONNECTIVITY_ALGO() {} - ~CN_CONNECTIVITY_ALGO() { Clear(); } + CN_CONNECTIVITY_ALGO() : + m_isLocal( false ) + {} + + ~CN_CONNECTIVITY_ALGO() + { + Clear(); + } bool ItemExists( const BOARD_CONNECTED_ITEM* aItem ) const { @@ -201,8 +207,9 @@ public: return m_dirtyNets.size(); } - void Build( BOARD* aZoneLayer, PROGRESS_REPORTER* aReporter = nullptr ); - void LocalBuild( const std::vector& aItems ); + void Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter = nullptr ); + void LocalBuild( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems ); void Clear(); @@ -276,6 +283,9 @@ private: std::vector> m_ratsnestClusters; std::vector m_dirtyNets; + bool m_isLocal; + std::shared_ptr m_globalConnectivity; + PROGRESS_REPORTER* m_progressReporter = nullptr; }; diff --git a/pcbnew/connectivity/connectivity_data.cpp b/pcbnew/connectivity/connectivity_data.cpp index 3a61e5f1d9..af67663412 100644 --- a/pcbnew/connectivity/connectivity_data.cpp +++ b/pcbnew/connectivity/connectivity_data.cpp @@ -44,7 +44,8 @@ #include #include -CONNECTIVITY_DATA::CONNECTIVITY_DATA() +CONNECTIVITY_DATA::CONNECTIVITY_DATA() : + m_skipRatsnestUpdate( false ) { m_connAlgo.reset( new CN_CONNECTIVITY_ALGO ); m_progressReporter = nullptr; @@ -52,10 +53,12 @@ CONNECTIVITY_DATA::CONNECTIVITY_DATA() } -CONNECTIVITY_DATA::CONNECTIVITY_DATA( const std::vector& aItems, bool aSkipRatsnest ) - : m_skipRatsnest( aSkipRatsnest ) +CONNECTIVITY_DATA::CONNECTIVITY_DATA( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems, + bool aSkipRatsnestUpdate ) : + m_skipRatsnestUpdate( aSkipRatsnestUpdate ) { - Build( aItems ); + Build( aGlobalConnectivity, aLocalItems ); m_progressReporter = nullptr; m_fromToCache.reset( new FROM_TO_CACHE ); } @@ -140,7 +143,8 @@ bool CONNECTIVITY_DATA::Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter ) } -void CONNECTIVITY_DATA::Build( const std::vector& aItems ) +void CONNECTIVITY_DATA::Build( std::shared_ptr& aGlobalConnectivity, + const std::vector& aLocalItems ) { std::unique_lock lock( m_lock, std::try_to_lock ); @@ -148,7 +152,7 @@ void CONNECTIVITY_DATA::Build( const std::vector& aItems ) return; m_connAlgo.reset( new CN_CONNECTIVITY_ALGO ); - m_connAlgo->LocalBuild( aItems ); + m_connAlgo->LocalBuild( aGlobalConnectivity->GetConnectivityAlgo(), aLocalItems ); internalRecalculateRatsnest(); } @@ -272,7 +276,7 @@ void CONNECTIVITY_DATA::internalRecalculateRatsnest( BOARD_COMMIT* aCommit ) m_connAlgo->ClearDirtyFlags(); - if( !m_skipRatsnest ) + if( !m_skipRatsnestUpdate ) updateRatsnest(); } diff --git a/pcbnew/connectivity/connectivity_data.h b/pcbnew/connectivity/connectivity_data.h index 18feae6057..45f35c9fbb 100644 --- a/pcbnew/connectivity/connectivity_data.h +++ b/pcbnew/connectivity/connectivity_data.h @@ -89,7 +89,8 @@ public: CONNECTIVITY_DATA(); ~CONNECTIVITY_DATA(); - CONNECTIVITY_DATA( const std::vector& aItems, bool aSkipItems = false ); + CONNECTIVITY_DATA( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems, bool aSkipRatsnestUpdate = false ); /** * Function Build() @@ -101,7 +102,8 @@ public: * Function Build() * Builds the connectivity database for a set of items aItems. */ - void Build( const std::vector& aItems ); + void Build( std::shared_ptr& aGlobalConnectivity, + const std::vector& aLocalItems ); /** * Function Add() @@ -300,7 +302,7 @@ private: std::vector m_nets; /// Used to suppress ratsnest calculations on dynamic ratsnests - bool m_skipRatsnest = false; + bool m_skipRatsnestUpdate; KISPINLOCK m_lock; diff --git a/pcbnew/router/router_tool.cpp b/pcbnew/router/router_tool.cpp index 89ba60b50f..08174bf99d 100644 --- a/pcbnew/router/router_tool.cpp +++ b/pcbnew/router/router_tool.cpp @@ -2175,7 +2175,8 @@ int ROUTER_TOOL::InlineDrag( const TOOL_EVENT& aEvent ) courtyardClearanceDRC.m_FpInMove.push_back( footprint ); } - dynamicData = std::make_unique( dynamicItems, true ); + dynamicData = std::make_unique( board()->GetConnectivity(), + dynamicItems, true ); connectivityData->BlockRatsnestItems( dynamicItems ); } else diff --git a/pcbnew/tools/board_inspection_tool.cpp b/pcbnew/tools/board_inspection_tool.cpp index 8413d826ca..d55e444ab2 100644 --- a/pcbnew/tools/board_inspection_tool.cpp +++ b/pcbnew/tools/board_inspection_tool.cpp @@ -1974,7 +1974,7 @@ void BOARD_INSPECTION_TOOL::calculateSelectionRatsnest( const VECTOR2I& aDelta ) if( !m_dynamicData ) { - m_dynamicData = new CONNECTIVITY_DATA( items, true ); + m_dynamicData = new CONNECTIVITY_DATA( board()->GetConnectivity(), items, true ); connectivity->BlockRatsnestItems( items ); } else