From 12174426d2d9a7f0de15c36580778a6f21e3ee53 Mon Sep 17 00:00:00 2001 From: deanlee Date: Wed, 3 Dec 2025 15:26:05 +0800 Subject: [PATCH] safe VisionBuf life time via client owner reference --- msgq/visionipc/visionipc_pyx.pxd | 3 ++- msgq/visionipc/visionipc_pyx.pyx | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/msgq/visionipc/visionipc_pyx.pxd b/msgq/visionipc/visionipc_pyx.pxd index ec431ceec..0deea317c 100644 --- a/msgq/visionipc/visionipc_pyx.pxd +++ b/msgq/visionipc/visionipc_pyx.pxd @@ -10,6 +10,7 @@ cdef class CLContext: cdef class VisionBuf: cdef cppVisionBuf * buf + cdef object _owner @staticmethod - cdef create(cppVisionBuf*) + cdef create(cppVisionBuf*, object) diff --git a/msgq/visionipc/visionipc_pyx.pyx b/msgq/visionipc/visionipc_pyx.pyx index 7f4d2209a..d253756d8 100644 --- a/msgq/visionipc/visionipc_pyx.pyx +++ b/msgq/visionipc/visionipc_pyx.pyx @@ -30,11 +30,15 @@ cpdef enum VisionStreamType: cdef class VisionBuf: @staticmethod - cdef create(cppVisionBuf * cbuf): + cdef create(cppVisionBuf * cbuf, object owner): buf = VisionBuf() buf.buf = cbuf + buf._owner = owner # Keep a reference to the owner to manage lifetime return buf + def __dealloc__(self): + self._owner = None # Explicitly release the reference + @property def data(self): return np.asarray( self.buf.addr) @@ -155,7 +159,7 @@ cdef class VisionIpcClient: buf = self.client.recv(&self.extra, timeout_ms) if not buf: return None - return VisionBuf.create(buf) + return VisionBuf.create(buf, self) def connect(self, bool blocking): return self.client.connect(blocking)