Python API: edge neighborhood nodes retain visitors after leaving scope
Los mantenedores suelen responder en 1 día
@klayoutmatthias ya está trabajando en esto.
Desde el 10/11/2026.
- #2543 de @klayoutmatthias — abierto
Evaluación
Este issue todavía no se ha evaluado.
Descripción
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
- Lenguaje dominante
- C++
- Estrellas
- 1.2k
- Forks
- 305
- Merge medio
- 3 d 2 h
- PR fusionados (30 d)
- 11
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de KLayout/klayout
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
KLayout/klayout#2554 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
KLayout/klayout#2412 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
DRC functions not working properly with clip in placePosiblemente ocupada @klayoutmatthias la tomó hoy. Abiertobug
KLayout/klayout#2553 · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 50/100
Los mantenedores suelen responder en 1 día
-
Deep DRC can miss violations when a cell has many shapesQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
KLayout/klayout#2546 · 5 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de KLayout/klayout
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día
-
Integer underflow and buffer overrun in detail::count_rows on disconnected distance matricesAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
LaneDibello/Kotor-Patch-Manager#375 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
Los mantenedores suelen responder en 1 día