diff --git a/pcbnew/connectivity/connectivity_data.cpp b/pcbnew/connectivity/connectivity_data.cpp index 29404e8ad5..9fb5355b88 100644 --- a/pcbnew/connectivity/connectivity_data.cpp +++ b/pcbnew/connectivity/connectivity_data.cpp @@ -128,7 +128,7 @@ bool CONNECTIVITY_DATA::Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter ) aReporter->KeepRefreshing( false ); } - RecalculateRatsnest(); + internalRecalculateRatsnest(); if( aReporter ) { @@ -150,7 +150,7 @@ void CONNECTIVITY_DATA::Build( const std::vector& aItems ) m_connAlgo.reset( new CN_CONNECTIVITY_ALGO ); m_connAlgo->LocalBuild( aItems ); - RecalculateRatsnest(); + internalRecalculateRatsnest(); } @@ -208,11 +208,14 @@ void CONNECTIVITY_DATA::RecalculateRatsnest( BOARD_COMMIT* aCommit ) // We can take over the lock here if called in the same thread // This is to prevent redraw during a RecalculateRatsnets process - std::unique_lock lock( m_lock, std::adopt_lock ); + std::unique_lock lock( m_lock ); - if( !lock ) - return; + internalRecalculateRatsnest( aCommit ); +} + +void CONNECTIVITY_DATA::internalRecalculateRatsnest( BOARD_COMMIT* aCommit ) +{ m_connAlgo->PropagateNets( aCommit ); int lastNet = m_connAlgo->NetCount(); diff --git a/pcbnew/connectivity/connectivity_data.h b/pcbnew/connectivity/connectivity_data.h index f30cca9015..ab0b09f11c 100644 --- a/pcbnew/connectivity/connectivity_data.h +++ b/pcbnew/connectivity/connectivity_data.h @@ -295,9 +295,15 @@ public: std::shared_ptr GetFromToCache() { return m_fromToCache; } private: - void updateRatsnest(); - void addRatsnestCluster( const std::shared_ptr& aCluster ); + /** + * Updates the ratsnest for the board without locking the connectivity mutex. + * @param aCommit is used to save the undo state of items modified by this call + */ + void internalRecalculateRatsnest( BOARD_COMMIT* aCommit = nullptr ); + void updateRatsnest(); + + void addRatsnestCluster( const std::shared_ptr& aCluster ); private: std::shared_ptr m_connAlgo;