Skip to content

Break reference cycle between FilterLink and Graph#2285

Merged
WyattBlue merged 1 commit into
PyAV-Org:mainfrom
lgeiger:filterlink-refcycle
Jun 5, 2026
Merged

Break reference cycle between FilterLink and Graph#2285
WyattBlue merged 1 commit into
PyAV-Org:mainfrom
lgeiger:filterlink-refcycle

Conversation

@lgeiger
Copy link
Copy Markdown
Contributor

@lgeiger lgeiger commented Jun 5, 2026

This breaks a reference cycle similar to what has been done for FilterContext in #1439.

import gc
from av.filter import Graph


def test_graph_leak():
    graph = Graph()
    src = graph.add("testsrc")
    sink = graph.add("buffersink")
    src.link_to(sink)
    src.outputs[0].link


test_graph_leak()

gc.set_debug(gc.DEBUG_SAVEALL)
collected = gc.collect()
print(f"Collected {collected} objects")
for obj in gc.garbage:
    print(f"  - {type(obj).__name__}")

main:

Collected 14 objects
  - Graph
  - dict
  - dict
  - dict
  - Filter
  - FilterContext
  - ReferenceType
  - list
  - Filter
  - FilterContext
  - list
  - FilterContextPad
  - tuple
  - FilterLink

This PR:

Collected 6 objects
  - Filter
  - FilterContext
  - ReferenceType
  - FilterContextPad
  - tuple
  - FilterLink

Found while looking into #2282

@WyattBlue WyattBlue merged commit 4af11a2 into PyAV-Org:main Jun 5, 2026
7 checks passed
@lgeiger lgeiger deleted the filterlink-refcycle branch June 5, 2026 21:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants