Skip to content

Commit c629f41

Browse files
committed
release GIL during blocking visionipc calls
1 parent a16cf1f commit c629f41

2 files changed

Lines changed: 23 additions & 9 deletions

File tree

msgq/visionipc/visionipc.pxd

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ cdef extern from "msgq/visionipc/visionipc_client.h":
5454
int num_buffers
5555
VisionBuf buffers[1]
5656
VisionIpcClient(string, VisionStreamType, bool, void*, void*)
57-
VisionBuf * recv(VisionIpcBufExtra *, int)
58-
bool connect(bool)
59-
bool is_connected()
57+
VisionBuf * recv(VisionIpcBufExtra *, int) nogil
58+
bool connect(bool) nogil
59+
bool is_connected() nogil
6060
@staticmethod
61-
set[VisionStreamType] getAvailableStreams(string, bool)
61+
set[VisionStreamType] getAvailableStreams(string, bool) nogil

msgq/visionipc/visionipc_pyx.pyx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ from cython.view cimport array
88
from libc.string cimport memcpy
99
from libc.stdint cimport uint32_t, uint64_t
1010
from libcpp cimport bool
11+
from libcpp.set cimport set as cpp_set
1112
from libcpp.string cimport string
1213

1314
from .visionipc cimport VisionIpcServer as cppVisionIpcServer
1415
from .visionipc cimport VisionIpcClient as cppVisionIpcClient
1516
from .visionipc cimport VisionBuf as cppVisionBuf
17+
from .visionipc cimport VisionStreamType as cppVisionStreamType
1618
from .visionipc cimport VisionIpcBufExtra
1719
from .visionipc cimport get_endpoint_name as cpp_get_endpoint_name
1820

@@ -109,7 +111,8 @@ cdef class VisionIpcClient:
109111
self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL)
110112

111113
def __dealloc__(self):
112-
del self.client
114+
with nogil:
115+
del self.client
113116

114117
@property
115118
def width(self):
@@ -152,17 +155,28 @@ cdef class VisionIpcClient:
152155
return self.extra.valid
153156

154157
def recv(self, int timeout_ms=100):
155-
buf = self.client.recv(&self.extra, timeout_ms)
158+
cdef cppVisionBuf * buf
159+
with nogil:
160+
buf = self.client.recv(&self.extra, timeout_ms)
156161
if not buf:
157162
return None
158163
return VisionBuf.create(buf)
159164

160165
def connect(self, bool blocking):
161-
return self.client.connect(blocking)
166+
cdef bool result
167+
with nogil:
168+
result = self.client.connect(blocking)
169+
return result
162170

163171
def is_connected(self):
164-
return self.client.is_connected()
172+
cdef bool connected
173+
with nogil:
174+
connected = self.client.is_connected()
175+
return connected
165176

166177
@staticmethod
167178
def available_streams(string name, bool block):
168-
return cppVisionIpcClient.getAvailableStreams(name, block)
179+
cdef cpp_set[cppVisionStreamType] streams
180+
with nogil:
181+
streams = cppVisionIpcClient.getAvailableStreams(name, block)
182+
return streams

0 commit comments

Comments
 (0)