[Python-checkins] bpo-45012: Release GIL around stat in os.scandir (GH-28085)

ambv webhook-mailer at python.org
Tue Sep 7 13:55:29 EDT 2021


https://github.com/python/cpython/commit/9dc363ee7cf2eb6ff374fbf7bbeb0b333f4afb8f
commit: 9dc363ee7cf2eb6ff374fbf7bbeb0b333f4afb8f
branch: main
author: Stanisław Skonieczny <stanislaw.skonieczny at gmail.com>
committer: ambv <lukasz at langa.pl>
date: 2021-09-07T19:55:20+02:00
summary:

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.

files:
A Misc/NEWS.d/next/Core and Builtins/2021-08-31-11-09-52.bpo-45012.ueeOcx.rst
M Misc/ACKS
M Modules/posixmodule.c

diff --git a/Misc/ACKS b/Misc/ACKS
index 481e46d4c1732..23c92abb4d02a 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 0000000000000..91cb3a9e69cc5
--- /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 73e7e60fe63ff..89659ae3490da 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);



More information about the Python-checkins mailing list