fix(perception): release processed source payloads
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import gc
|
||||
import json
|
||||
import subprocess
|
||||
import sys
|
||||
import threading
|
||||
import weakref
|
||||
from collections.abc import Callable, Iterator
|
||||
from dataclasses import replace
|
||||
from pathlib import Path
|
||||
@@ -553,6 +555,40 @@ def test_reference_graph_v2_observes_final_delivery_completion_age() -> None:
|
||||
assert observed == [(0, 123, 123)]
|
||||
|
||||
|
||||
def test_reference_graph_retains_source_identity_without_processed_payload() -> None:
|
||||
packet = _packet(0)
|
||||
graph = _graph_v2(_Source((packet,)))
|
||||
|
||||
result = graph.run()
|
||||
|
||||
assert result.state is GraphState.STOPPED
|
||||
assert graph._admitted == {0: packet.envelope}
|
||||
assert graph._admitted_at_ns == {}
|
||||
|
||||
|
||||
def test_reference_graph_releases_ephemeral_source_payloads_after_run() -> None:
|
||||
payloads: list[weakref.ReferenceType[np.ndarray]] = []
|
||||
|
||||
class EphemeralSource:
|
||||
provider_id = _Source.provider_id
|
||||
|
||||
def packets(self, stop_event: Event) -> Iterator[SourcePacket]:
|
||||
for sequence in range(32):
|
||||
if stop_event.is_set():
|
||||
return
|
||||
image = np.empty((64, 64, 3), dtype=np.uint8)
|
||||
payloads.append(weakref.ref(image))
|
||||
yield replace(_packet(sequence), image_payload=image)
|
||||
|
||||
graph = _graph_v2(EphemeralSource())
|
||||
|
||||
result = graph.run()
|
||||
gc.collect()
|
||||
|
||||
assert result.state is GraphState.STOPPED
|
||||
assert not any(reference() is not None for reference in payloads)
|
||||
|
||||
|
||||
def test_reference_graph_v2_observes_exact_delivery_evidence_inputs() -> None:
|
||||
observed: list[tuple[int, int, tuple[str, ...], frozenset[str], int]] = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user