Skip to content

Commit 7e69ab8

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

2 files changed

Lines changed: 18 additions & 7 deletions

File tree

msgq/visionipc/visionipc.pxd

Lines changed: 3 additions & 3 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)
57+
VisionBuf * recv(VisionIpcBufExtra *, int) nogil
58+
bool connect(bool) nogil
5959
bool is_connected()
6060
@staticmethod
61-
set[VisionStreamType] getAvailableStreams(string, bool)
61+
set[VisionStreamType] getAvailableStreams(string, bool) nogil

msgq/visionipc/visionipc_pyx.pyx

Lines changed: 15 additions & 4 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,25 @@ 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):
164172
return self.client.is_connected()
165173

166174
@staticmethod
167175
def available_streams(string name, bool block):
168-
return cppVisionIpcClient.getAvailableStreams(name, block)
176+
cdef cpp_set[cppVisionStreamType] streams
177+
with nogil:
178+
streams = cppVisionIpcClient.getAvailableStreams(name, block)
179+
return streams

0 commit comments

Comments
 (0)