From: Stanisław Skonieczny Date: Tue, 7 Sep 2021 17:55:20 +0000 (+0200) Subject: bpo-45012: Release GIL around stat in os.scandir (GH-28085) X-Git-Tag: v3.11.0a1~232 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9dc363ee7cf2eb6ff374fbf7bbeb0b333f4afb8f;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Misc/ACKS b/Misc/ACKS index 481e46d4c173..23c92abb4d02 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 000000000000..91cb3a9e69cc --- /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 73e7e60fe63f..89659ae3490d 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);