Python API: edge neighborhood nodes retain visitors after leaving scope

オープン
#2,542 コメント 1 件 リアクション 0 件 担当者 1 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@klayoutmatthias がすでに取り組んでいます。

2026年11月10日 から。

  • #2543 @klayoutmatthias による — オープン

評価

この issue はまだ評価されていません。

説明

bug

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_op on 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:

Versions:

  • KLayout Python module 0.30.13, Python 3.14.6, macOS 26.6.2
  • Independent node-only and flat-region reproductions: KLayout Python module 0.30.13, Python 3.12.3, Linux
  • The KLayout executable is not involved
  • Source tag v0.30.13, commit 06b8ff4909ad1696c06c634183d8fd0eaa8a1b83
主要言語
C++
スター
1.2k
フォーク
305
平均マージ
3日 2時間
マージ済み PR(30日)
11

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

KLayout/klayout のほかの issue

KLayout/klayout の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。