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)