diff options
author | David Lechner <david@pybricks.com> | 2020-01-22 18:14:03 -0600 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2020-01-26 23:21:29 +1100 |
commit | fee7e5617f55b4778de74ee185fcc3950cdc7b6d (patch) | |
tree | 9a1fec68969ee8e27e74a5e92761ae1a194580bb /ports/unix/moduselect.c | |
parent | 96716b46e1c4945d3fe08d9ba91920ca28f9c986 (diff) |
unix: Release GIL during all system calls.
Addition of GIL EXIT/ENTER pairs are:
- modos: release the GIL during system calls. CPython does this as well.
- moduselect: release the GIL during the poll() syscall. This call can be
blocking, so it is important to allow other threads to run at this time.
- modusocket: release the GIL during system calls. Many of these calls can
be blocking, so it is important to allow other threads to run.
- unix_mphal: release the GIL during the read and write syscalls in
mp_hal_stdin_rx_chr and mp_hal_stdout_tx_strn. If we don't do this
threads are blocked when the REPL or the builtin input function are used.
- file, main, mpconfigport.h: release GIL during syscalls in built-in
functions that could block.
Diffstat (limited to 'ports/unix/moduselect.c')
-rw-r--r-- | ports/unix/moduselect.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/ports/unix/moduselect.c b/ports/unix/moduselect.c index d9b02ddc6..4a095ec29 100644 --- a/ports/unix/moduselect.c +++ b/ports/unix/moduselect.c @@ -39,6 +39,7 @@ #include "py/objlist.h" #include "py/objtuple.h" #include "py/mphal.h" +#include "py/mpthread.h" #include "fdfile.h" #define DEBUG 0 @@ -188,7 +189,9 @@ STATIC int poll_poll_internal(size_t n_args, const mp_obj_t *args) { self->flags = flags; + MP_THREAD_GIL_EXIT(); int n_ready = poll(self->entries, self->len, timeout); + MP_THREAD_GIL_ENTER(); RAISE_ERRNO(n_ready, errno); return n_ready; } |