diff options
author | Daniël van de Giessen <daniel@dvdgiessen.nl> | 2022-11-23 14:20:58 +0100 |
---|---|---|
committer | Daniël van de Giessen <daniel@dvdgiessen.nl> | 2023-09-01 14:23:54 +0200 |
commit | 3cc3e4e032edd912dd3a55b8df65927e48217f2c (patch) | |
tree | a0c15e0e1476afcad16bc79bb42527b66aedb500 /ports/esp32/machine_uart.c | |
parent | f8bd6778c85322b33008d749ae4021cafa067044 (diff) |
esp32/machine_uart: Release GIL for blocking reads.
If we're reading from an UART with a non-zero timeout, we can release the
GIL so that other threads/tasks may run while we are sleeping waiting for
data to arrive.
Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
Diffstat (limited to 'ports/esp32/machine_uart.c')
-rw-r--r-- | ports/esp32/machine_uart.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/ports/esp32/machine_uart.c b/ports/esp32/machine_uart.c index 541d7ccc5..0b4f5890b 100644 --- a/ports/esp32/machine_uart.c +++ b/ports/esp32/machine_uart.c @@ -472,8 +472,17 @@ STATIC mp_uint_t machine_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t siz time_to_wait = pdMS_TO_TICKS(self->timeout); } + bool release_gil = time_to_wait > 0; + if (release_gil) { + MP_THREAD_GIL_EXIT(); + } + int bytes_read = uart_read_bytes(self->uart_num, buf_in, size, time_to_wait); + if (release_gil) { + MP_THREAD_GIL_ENTER(); + } + if (bytes_read <= 0) { *errcode = MP_EAGAIN; return MP_STREAM_ERROR; |