match a camera's frame names exactly in close_camera

The prefix match on `{camera}_frame` also caught another camera whose name starts with it, so removing `cam` dropped the cached ring of a camera named `cam_frame`.
This commit is contained in:
Josh Hawkins
2026-10-12 09:23:38 -05:00
parent 641a4ee0c6
commit 5ad1190c53
2 changed files with 13 additions and 3 deletions
@@ -289,10 +289,17 @@ class TestSharedMemoryFrameManagerFrameTimes(unittest.TestCase):
manager.shm_store.update( manager.shm_store.update(
_segments(cam_frame0=1, cam_frame1=1, cam_frame_times=8, other_frame0=1) _segments(cam_frame0=1, cam_frame1=1, cam_frame_times=8, other_frame0=1)
) )
# a camera named cam_frame shares the cam_frame prefix
manager.shm_store.update(
{"cam_frame_frame0": _fake_shm(1), "cam_frame_frame_times": _fake_shm(8)}
)
manager.close_camera("cam") manager.close_camera("cam")
self.assertEqual(set(manager.shm_store), {"other_frame0"}) self.assertEqual(
set(manager.shm_store),
{"other_frame0", "cam_frame_frame0", "cam_frame_frame_times"},
)
def test_get_without_frame_time_skips_ledger(self) -> None: def test_get_without_frame_time_skips_ledger(self) -> None:
manager = SharedMemoryFrameManager() manager = SharedMemoryFrameManager()
+5 -2
View File
@@ -1171,8 +1171,11 @@ class SharedMemoryFrameManager(FrameManager):
def close_camera(self, camera: str) -> None: def close_camera(self, camera: str) -> None:
"""Drop every cached mapping for a camera's frame ring and ledger.""" """Drop every cached mapping for a camera's frame ring and ledger."""
for name in [n for n in self.shm_store if n.startswith(f"{camera}_frame")]: for name in list(self.shm_store):
self.close(name) owner, _, suffix = name.rpartition("_frame")
if owner == camera and (suffix.isdigit() or suffix == "_times"):
self.close(name)
def delete(self, name: str): def delete(self, name: str):
if name in self.shm_store: if name in self.shm_store: