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時間
- マージ済み PR(30日)
- 11
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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再び着手できるかも このイシューのプルリクエストはマージされずにクローズされました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 52/100
KLayout/klayout#2546 · コメント 5 件 ·
メンテナーはふだん 1 日以内に返信
KLayout/klayout の issue をすべて見る
似ている 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 日以内に返信