Python API: edge neighborhood nodes retain visitors after leaving scope
Maintainers usually reply within 1 day
Assessment
This issue has not been assessed yet.
Description
Creating CompoundRegionOperationNode.new_edge_neighborhood leaves its Python visitor alive after the node wrapper and all Python references to the visitor have been dropped. Repeated construction accumulates visitors and any data attached to them. Calling Region.complex_op is not needed to reproduce this.
Expected: once the node and visitor are no longer referenced, the visitor can be collected.
Minimal reproduction:
import gc
import weakref
from typing import List, Tuple
import klayout.db as kdb
class Visitor(kdb.EdgeNeighborhoodVisitor):
def on_edge(self, layout: kdb.Layout, cell: kdb.Cell, edge: kdb.Edge, neighborhood: List):
pass
def make() -> Tuple[weakref.ReferenceType, weakref.ReferenceType]:
visitor = Visitor()
node = kdb.CompoundRegionOperationNode.new_edge_neighborhood(
children=[], visitor=visitor)
return weakref.ref(visitor), weakref.ref(node)
references = [make() for _ in range(100)]
gc.collect()
print("Visitors alive:", sum(visitor() is not None for visitor, _ in references))
print("Node wrappers alive:", sum(node() is not None for _, node in references))
Actual: 100 visitors and zero node wrappers remain alive.
Controls:
- Constructing and discarding visitors without constructing nodes leaves zero of 100 visitors alive
- Creating nodes without executing them leaves 1, 10 and 100 visitors alive after 1, 10 and 100 calls
- Executing
complex_opon ordinary flat rectangular regions gives the same 1, 10 and 100 counts - The node-only and flat-region reproductions also retain all 100 visitors on Linux with Python
3.12.3
The reproduction has no extraction context, DeepShapeStore, callback instrumentation or retained strong-reference collection. Its observation list contains only weak references.
This is distinct from #2495, which concerned retained on_edge arguments and was fixed by #2501. Here no callback needs to run. In KPEX, each visitor refers to the extraction results, so retained visitors can keep completed extraction data alive when operations are repeated in one process.
The v0.30.13 source appears consistent with this lifetime observation:
- The edge-neighborhood constructor calls
visitor->keep() - The node stores the visitor as a
tl::weak_ptr, with no matching visitor release in the class gsi::ObjectBase::keepmarks the object as owned by C++ rather than the script- The polygon-neighborhood constructor uses the same ownership pattern
Versions:
KLayoutPython module0.30.13, Python3.14.6, macOS26.6.2- Independent node-only and flat-region reproductions:
KLayoutPython module0.30.13, Python3.12.3, Linux - The
KLayoutexecutable is not involved - Source tag
v0.30.13, commit06b8ff4909ad1696c06c634183d8fd0eaa8a1b83
- Dominant language
- C++
- Stars
- 1.2k
- Forks
- 305
- Avg merge
- 3d 2h
- Merged PRs (30d)
- 11
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from KLayout/klayout
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
KLayout/klayout#2554 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
KLayout/klayout#2412 · 3 comments ·
Maintainers usually reply within 1 day
-
DRC functions not working properly with clip in placePossibly taken @klayoutmatthias claimed this today. Openbug
KLayout/klayout#2553 · 1 assignee ·
Maintainers usually reply within 1 day
-
Difficulty 3/5 1-2 days Newbie friendliness 50/100
Maintainers usually reply within 1 day
-
Deep DRC can miss violations when a cell has many shapesMay be free again A pull request for this issue was closed without being merged. Open
Difficulty 4/5 3-5 days Newbie friendliness 52/100
KLayout/klayout#2546 · 5 comments ·
Maintainers usually reply within 1 day
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 3 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
LaneDibello/Kotor-Patch-Manager#375 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
Maintainers usually reply within 1 day