From 9dc363ee7cf2eb6ff374fbf7bbeb0b333f4afb8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Skonieczny?= Date: Tue, 7 Sep 2021 19:55:20 +0200 Subject: bpo-45012: Release GIL around stat in os.scandir (GH-28085) Releasing GIL allows other threads to continue its work when os.scandir is fetching DirEntry.stat info from file system. --- Misc/ACKS | 1 + .../Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst | 2 ++ Modules/posixmodule.c | 10 ++++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst diff --git a/Misc/ACKS b/Misc/ACKS index 481e46d..23c92ab 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1645,6 +1645,7 @@ J. Sipprell Ngalim Siregar Kragen Sitaker Kaartic Sivaraam +Stanisław Skonieczny Roman Skurikhin Ville Skyttä Michael Sloan diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst new file mode 100644 index 0000000..91cb3a9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst @@ -0,0 +1,2 @@ +In :mod:`posix`, release GIL during ``stat()``, ``lstat()``, and +``fstatat()`` syscalls made by :func:`os.DirEntry.stat`. Patch by Stanisław Skonieczny. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 73e7e60..89659ae 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -13489,8 +13489,10 @@ _Py_COMP_DIAG_POP if (self->dir_fd != DEFAULT_DIR_FD) { #ifdef HAVE_FSTATAT if (HAVE_FSTATAT_RUNTIME) { + Py_BEGIN_ALLOW_THREADS result = fstatat(self->dir_fd, path, &st, follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); + Py_END_ALLOW_THREADS } else #endif /* HAVE_FSTATAT */ @@ -13503,10 +13505,14 @@ _Py_COMP_DIAG_POP else #endif { - if (follow_symlinks) + Py_BEGIN_ALLOW_THREADS + if (follow_symlinks) { result = STAT(path, &st); - else + } + else { result = LSTAT(path, &st); + } + Py_END_ALLOW_THREADS } #if defined(MS_WINDOWS) && !USE_UNICODE_WCHAR_CACHE PyMem_Free(path); -- cgit v0.12