summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniël van de Giessen <daniel@dvdgiessen.nl>2022-11-23 14:20:58 +0100
committerDaniël van de Giessen <daniel@dvdgiessen.nl>2023-09-01 14:23:54 +0200
commit3cc3e4e032edd912dd3a55b8df65927e48217f2c (patch)
treea0c15e0e1476afcad16bc79bb42527b66aedb500
parentf8bd6778c85322b33008d749ae4021cafa067044 (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>
-rw-r--r--ports/esp32/machine_uart.c9
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;