[Python-checkins] bpo-38110: Use fdwalk for os.closerange() when available. (GH-15224)

Miss Islington (bot) webhook-mailer at python.org
Thu Sep 12 07:19:25 EDT 2019


https://github.com/python/cpython/commit/84eb42e3c90c03f13262f19185b14566e10941ac
commit: 84eb42e3c90c03f13262f19185b14566e10941ac
branch: 3.8
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2019-09-12T04:19:21-07:00
summary:

bpo-38110: Use fdwalk for os.closerange() when available. (GH-15224)


Use fdwalk() on platforms that support it to implement os.closerange().
(cherry picked from commit e20134f889a0cfcc37a46979f31a1c98b800de07)

Co-authored-by: Jakub Kulík <Kulikjak at gmail.com>

files:
A Misc/NEWS.d/next/Library/2019-09-11-14-49-20.bpo-38110.A19Y-q.rst
M Modules/posixmodule.c
M configure
M configure.ac
M pyconfig.h.in

diff --git a/Misc/NEWS.d/next/Library/2019-09-11-14-49-20.bpo-38110.A19Y-q.rst b/Misc/NEWS.d/next/Library/2019-09-11-14-49-20.bpo-38110.A19Y-q.rst
new file mode 100644
index 000000000000..7b94a2e90a50
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-09-11-14-49-20.bpo-38110.A19Y-q.rst
@@ -0,0 +1,2 @@
+The os.closewalk() implementation now uses the libc fdwalk() API on
+platforms where it is available.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index cf6c00b7d6ae..a066eb1e66d4 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -8419,6 +8419,21 @@ os_close_impl(PyObject *module, int fd)
 }
 
 
+#ifdef HAVE_FDWALK
+static int
+_fdwalk_close_func(void *lohi, int fd)
+{
+    int lo = ((int *)lohi)[0];
+    int hi = ((int *)lohi)[1];
+
+    if (fd >= hi)
+        return 1;
+    else if (fd >= lo)
+        close(fd);
+    return 0;
+}
+#endif /* HAVE_FDWALK */
+
 /*[clinic input]
 os.closerange
 
@@ -8433,11 +8448,21 @@ static PyObject *
 os_closerange_impl(PyObject *module, int fd_low, int fd_high)
 /*[clinic end generated code: output=0ce5c20fcda681c2 input=5855a3d053ebd4ec]*/
 {
+#ifdef HAVE_FDWALK
+    int lohi[2];
+#else
     int i;
+#endif
     Py_BEGIN_ALLOW_THREADS
     _Py_BEGIN_SUPPRESS_IPH
+#ifdef HAVE_FDWALK
+    lohi[0] = Py_MAX(fd_low, 0);
+    lohi[1] = fd_high;
+    fdwalk(_fdwalk_close_func, lohi);
+#else
     for (i = Py_MAX(fd_low, 0); i < fd_high; i++)
         close(i);
+#endif
     _Py_END_SUPPRESS_IPH
     Py_END_ALLOW_THREADS
     Py_RETURN_NONE;
diff --git a/configure b/configure
index 59466c6123d6..4beaf7a9c5e8 100755
--- a/configure
+++ b/configure
@@ -11500,7 +11500,7 @@ fi
 for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
  clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
  faccessat fchmod fchmodat fchown fchownat \
- fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
+ fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
  futimens futimes gai_strerror getentropy \
  getgrgid_r getgrnam_r \
  getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
diff --git a/configure.ac b/configure.ac
index 0689c70e1e99..f7e0d80f02e3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3538,7 +3538,7 @@ fi
 AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
  clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
  faccessat fchmod fchmodat fchown fchownat \
- fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
+ fdwalk fexecve fdopendir fork fpathconf fstatat ftime ftruncate futimesat \
  futimens futimes gai_strerror getentropy \
  getgrgid_r getgrnam_r \
  getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
diff --git a/pyconfig.h.in b/pyconfig.h.in
index 840fbcdb2a6f..5f952d2cfc36 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
@@ -341,6 +341,9 @@
 /* Define to 1 if you have the `fdopendir' function. */
 #undef HAVE_FDOPENDIR
 
+/* Define to 1 if you have the `fdwalk' function. */
+#undef HAVE_FDWALK
+
 /* Define to 1 if you have the `fexecve' function. */
 #undef HAVE_FEXECVE
 



More information about the Python-checkins mailing list