diff options
author | David Lechner <david@pybricks.com> | 2020-01-24 11:50:31 -0600 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2020-01-26 23:26:31 +1100 |
commit | 62537a18e3743a040e8b673686665f27f7504ca8 (patch) | |
tree | 3d8c1c4ac93427f4f6ee4283d7c27af6f6ce685a /py/persistentcode.c | |
parent | 35f66d38b8e153399b5d277b6e02ea1a98eccee1 (diff) |
py: Release GIL during syscalls in reader and writer code.
This releases the GIL during POSIX system calls that could block.
Diffstat (limited to 'py/persistentcode.c')
-rw-r--r-- | py/persistentcode.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/py/persistentcode.c b/py/persistentcode.c index 7a8a94b5a..7039f9f57 100644 --- a/py/persistentcode.c +++ b/py/persistentcode.c @@ -34,6 +34,7 @@ #include "py/persistentcode.h" #include "py/bc0.h" #include "py/objstr.h" +#include "py/mpthread.h" #if MICROPY_PERSISTENT_CODE_LOAD || MICROPY_PERSISTENT_CODE_SAVE @@ -821,15 +822,21 @@ void mp_raw_code_save(mp_raw_code_t *rc, mp_print_t *print) { STATIC void fd_print_strn(void *env, const char *str, size_t len) { int fd = (intptr_t)env; + MP_THREAD_GIL_EXIT(); ssize_t ret = write(fd, str, len); + MP_THREAD_GIL_ENTER(); (void)ret; } void mp_raw_code_save_file(mp_raw_code_t *rc, const char *filename) { + MP_THREAD_GIL_EXIT(); int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); + MP_THREAD_GIL_ENTER(); mp_print_t fd_print = {(void*)(intptr_t)fd, fd_print_strn}; mp_raw_code_save(rc, &fd_print); + MP_THREAD_GIL_EXIT(); close(fd); + MP_THREAD_GIL_ENTER(); } #else |