Python API: edge neighborhood nodes retain visitors after leaving scope
维护者通常 1 天内回复
评估
这个 Issue 还没有评估数据。
描述
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
- 主要语言
- C++
- 星标
- 1.2k
- 派生
- 305
- 平均合并
- 3 天 2 小时
- 30 天内合并 PR
- 11
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
KLayout/klayout 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 70/100
KLayout/klayout#2554 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 62/100
KLayout/klayout#2412 · 3 条评论 ·
维护者通常 1 天内回复
-
DRC functions not working properly with clip in place可能已有人在做 @klayoutmatthias 今天认领。 未关闭bug
KLayout/klayout#2553 · 已指派 1 人 ·
维护者通常 1 天内回复
-
难度 3/5 1-2 天 新手友好度 50/100
维护者通常 1 天内回复
-
Deep DRC can miss violations when a cell has many shapes可能重新可做 关联的 PR 已关闭且未合并。 未关闭
难度 4/5 3-5 天 新手友好度 52/100
KLayout/klayout#2546 · 5 条评论 ·
维护者通常 1 天内回复
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 3 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 65/100
LaneDibello/Kotor-Patch-Manager#375 ·
维护者通常 2 天内回复
-
难度 2/5 1-3 小时 新手友好度 65/100
维护者通常 1 天内回复