Browse Source

When garbage collecting locally we also need to clear global references.

newinvert
Jeff Young 2 years ago
parent
commit
d93bb464bf
  1. 14
      pcbnew/connectivity/connectivity_algo.cpp
  2. 18
      pcbnew/connectivity/connectivity_algo.h
  3. 18
      pcbnew/connectivity/connectivity_data.cpp
  4. 8
      pcbnew/connectivity/connectivity_data.h
  5. 3
      pcbnew/router/router_tool.cpp
  6. 2
      pcbnew/tools/board_inspection_tool.cpp

14
pcbnew/connectivity/connectivity_algo.cpp

@ -223,6 +223,12 @@ void CN_CONNECTIVITY_ALGO::searchConnections()
m_itemList.RemoveInvalidItems( garbage ); m_itemList.RemoveInvalidItems( garbage );
if( m_isLocal )
{
for( CN_ITEM* item : m_globalConnectivity->m_itemList )
item->RemoveInvalidRefs();
}
for( CN_ITEM* item : garbage ) for( CN_ITEM* item : garbage )
delete item; delete item;
@ -553,9 +559,13 @@ void CN_CONNECTIVITY_ALGO::Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter )
} }
void CN_CONNECTIVITY_ALGO::LocalBuild( const std::vector<BOARD_ITEM*>& aItems )
void CN_CONNECTIVITY_ALGO::LocalBuild( std::shared_ptr<CN_CONNECTIVITY_ALGO> aGlobalConnectivity,
const std::vector<BOARD_ITEM*>& aLocalItems )
{ {
for( BOARD_ITEM* item : aItems )
m_isLocal = true;
m_globalConnectivity = aGlobalConnectivity;
for( BOARD_ITEM* item : aLocalItems )
{ {
switch( item->Type() ) switch( item->Type() )
{ {

18
pcbnew/connectivity/connectivity_algo.h

@ -158,8 +158,14 @@ public:
std::list<CN_ITEM*> m_items; std::list<CN_ITEM*> 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 bool ItemExists( const BOARD_CONNECTED_ITEM* aItem ) const
{ {
@ -201,8 +207,9 @@ public:
return m_dirtyNets.size(); return m_dirtyNets.size();
} }
void Build( BOARD* aZoneLayer, PROGRESS_REPORTER* aReporter = nullptr );
void LocalBuild( const std::vector<BOARD_ITEM*>& aItems );
void Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter = nullptr );
void LocalBuild( std::shared_ptr<CN_CONNECTIVITY_ALGO> aGlobalConnectivity,
const std::vector<BOARD_ITEM*>& aLocalItems );
void Clear(); void Clear();
@ -276,6 +283,9 @@ private:
std::vector<std::shared_ptr<CN_CLUSTER>> m_ratsnestClusters; std::vector<std::shared_ptr<CN_CLUSTER>> m_ratsnestClusters;
std::vector<bool> m_dirtyNets; std::vector<bool> m_dirtyNets;
bool m_isLocal;
std::shared_ptr<CN_CONNECTIVITY_ALGO> m_globalConnectivity;
PROGRESS_REPORTER* m_progressReporter = nullptr; PROGRESS_REPORTER* m_progressReporter = nullptr;
}; };

18
pcbnew/connectivity/connectivity_data.cpp

@ -44,7 +44,8 @@
#include <trigo.h> #include <trigo.h>
#include <drc/drc_rtree.h> #include <drc/drc_rtree.h>
CONNECTIVITY_DATA::CONNECTIVITY_DATA()
CONNECTIVITY_DATA::CONNECTIVITY_DATA() :
m_skipRatsnestUpdate( false )
{ {
m_connAlgo.reset( new CN_CONNECTIVITY_ALGO ); m_connAlgo.reset( new CN_CONNECTIVITY_ALGO );
m_progressReporter = nullptr; m_progressReporter = nullptr;
@ -52,10 +53,12 @@ CONNECTIVITY_DATA::CONNECTIVITY_DATA()
} }
CONNECTIVITY_DATA::CONNECTIVITY_DATA( const std::vector<BOARD_ITEM*>& aItems, bool aSkipRatsnest )
: m_skipRatsnest( aSkipRatsnest )
CONNECTIVITY_DATA::CONNECTIVITY_DATA( std::shared_ptr<CONNECTIVITY_DATA> aGlobalConnectivity,
const std::vector<BOARD_ITEM*>& aLocalItems,
bool aSkipRatsnestUpdate ) :
m_skipRatsnestUpdate( aSkipRatsnestUpdate )
{ {
Build( aItems );
Build( aGlobalConnectivity, aLocalItems );
m_progressReporter = nullptr; m_progressReporter = nullptr;
m_fromToCache.reset( new FROM_TO_CACHE ); 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<BOARD_ITEM*>& aItems )
void CONNECTIVITY_DATA::Build( std::shared_ptr<CONNECTIVITY_DATA>& aGlobalConnectivity,
const std::vector<BOARD_ITEM*>& aLocalItems )
{ {
std::unique_lock<KISPINLOCK> lock( m_lock, std::try_to_lock ); std::unique_lock<KISPINLOCK> lock( m_lock, std::try_to_lock );
@ -148,7 +152,7 @@ void CONNECTIVITY_DATA::Build( const std::vector<BOARD_ITEM*>& aItems )
return; return;
m_connAlgo.reset( new CN_CONNECTIVITY_ALGO ); m_connAlgo.reset( new CN_CONNECTIVITY_ALGO );
m_connAlgo->LocalBuild( aItems );
m_connAlgo->LocalBuild( aGlobalConnectivity->GetConnectivityAlgo(), aLocalItems );
internalRecalculateRatsnest(); internalRecalculateRatsnest();
} }
@ -272,7 +276,7 @@ void CONNECTIVITY_DATA::internalRecalculateRatsnest( BOARD_COMMIT* aCommit )
m_connAlgo->ClearDirtyFlags(); m_connAlgo->ClearDirtyFlags();
if( !m_skipRatsnest )
if( !m_skipRatsnestUpdate )
updateRatsnest(); updateRatsnest();
} }

8
pcbnew/connectivity/connectivity_data.h

@ -89,7 +89,8 @@ public:
CONNECTIVITY_DATA(); CONNECTIVITY_DATA();
~CONNECTIVITY_DATA(); ~CONNECTIVITY_DATA();
CONNECTIVITY_DATA( const std::vector<BOARD_ITEM*>& aItems, bool aSkipItems = false );
CONNECTIVITY_DATA( std::shared_ptr<CONNECTIVITY_DATA> aGlobalConnectivity,
const std::vector<BOARD_ITEM*>& aLocalItems, bool aSkipRatsnestUpdate = false );
/** /**
* Function Build() * Function Build()
@ -101,7 +102,8 @@ public:
* Function Build() * Function Build()
* Builds the connectivity database for a set of items aItems. * Builds the connectivity database for a set of items aItems.
*/ */
void Build( const std::vector<BOARD_ITEM*>& aItems );
void Build( std::shared_ptr<CONNECTIVITY_DATA>& aGlobalConnectivity,
const std::vector<BOARD_ITEM*>& aLocalItems );
/** /**
* Function Add() * Function Add()
@ -300,7 +302,7 @@ private:
std::vector<RN_NET*> m_nets; std::vector<RN_NET*> m_nets;
/// Used to suppress ratsnest calculations on dynamic ratsnests /// Used to suppress ratsnest calculations on dynamic ratsnests
bool m_skipRatsnest = false;
bool m_skipRatsnestUpdate;
KISPINLOCK m_lock; KISPINLOCK m_lock;

3
pcbnew/router/router_tool.cpp

@ -2175,7 +2175,8 @@ int ROUTER_TOOL::InlineDrag( const TOOL_EVENT& aEvent )
courtyardClearanceDRC.m_FpInMove.push_back( footprint ); courtyardClearanceDRC.m_FpInMove.push_back( footprint );
} }
dynamicData = std::make_unique<CONNECTIVITY_DATA>( dynamicItems, true );
dynamicData = std::make_unique<CONNECTIVITY_DATA>( board()->GetConnectivity(),
dynamicItems, true );
connectivityData->BlockRatsnestItems( dynamicItems ); connectivityData->BlockRatsnestItems( dynamicItems );
} }
else else

2
pcbnew/tools/board_inspection_tool.cpp

@ -1974,7 +1974,7 @@ void BOARD_INSPECTION_TOOL::calculateSelectionRatsnest( const VECTOR2I& aDelta )
if( !m_dynamicData ) if( !m_dynamicData )
{ {
m_dynamicData = new CONNECTIVITY_DATA( items, true );
m_dynamicData = new CONNECTIVITY_DATA( board()->GetConnectivity(), items, true );
connectivity->BlockRatsnestItems( items ); connectivity->BlockRatsnestItems( items );
} }
else else

Loading…
Cancel
Save