KLayout / klayout

KLayout Main Sources
http://www.klayout.org
GNU General Public License v3.0
808 stars 206 forks source link

Bugfix/issue 1907 #1910

Open klayoutmatthias opened 1 month ago

klayoutmatthias commented 1 month ago

The bug is fixed by locking a Layout for updates while a RecursiveShapeIterator is active. Also, RecursiveInstanceIterator behaves the same.

Layout updates are responsible for recomputing cell bounding boxes, annotating hierarchies (e.g. computing parent instances, top cells and hierarchy-ordering of cells) and quad tree building.

While a Layout is locked, Layout#under_construction will return true. Layouts in that state can be written, but reading the mentioned information may not render the actual state.

A RecursiveShapeIterator will lock the layout it is on once it delivered the first item. The lock is released when it reaches end.

This has one consequence when coding scripts in Ruby: as in Ruby, the lifetime of an object is extended until the garbage collector removes it, pending instances of RecursiveShapeIterator may lock the layout and updates will not happen.

To mitigate this, _destroy can be use to explicitly remove the iterator when it is not used any longer.

On Python, this situation arises, if the iterator is kept in a variable. The iterator releases the lock when it gets destroyed - this happens when such a variable goes out of scope or is reassigned.