bpo-38110: Use fdwalk for os.closerange() when available. (GH-15224)
Use fdwalk() on platforms that support it to implement os.closerange().
This commit is contained in:
parent
af636f4f91
commit
e20134f889
|
@ -0,0 +1,2 @@
|
||||||
|
The os.closewalk() implementation now uses the libc fdwalk() API on
|
||||||
|
platforms where it is available.
|
|
@ -8422,6 +8422,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]
|
/*[clinic input]
|
||||||
os.closerange
|
os.closerange
|
||||||
|
|
||||||
|
@ -8436,11 +8451,21 @@ static PyObject *
|
||||||
os_closerange_impl(PyObject *module, int fd_low, int fd_high)
|
os_closerange_impl(PyObject *module, int fd_low, int fd_high)
|
||||||
/*[clinic end generated code: output=0ce5c20fcda681c2 input=5855a3d053ebd4ec]*/
|
/*[clinic end generated code: output=0ce5c20fcda681c2 input=5855a3d053ebd4ec]*/
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_FDWALK
|
||||||
|
int lohi[2];
|
||||||
|
#else
|
||||||
int i;
|
int i;
|
||||||
|
#endif
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
_Py_BEGIN_SUPPRESS_IPH
|
_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++)
|
for (i = Py_MAX(fd_low, 0); i < fd_high; i++)
|
||||||
close(i);
|
close(i);
|
||||||
|
#endif
|
||||||
_Py_END_SUPPRESS_IPH
|
_Py_END_SUPPRESS_IPH
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
|
|
|
@ -11500,7 +11500,7 @@ fi
|
||||||
for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
|
for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
|
||||||
clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
|
clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
|
||||||
faccessat fchmod fchmodat fchown fchownat \
|
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 \
|
futimens futimes gai_strerror getentropy \
|
||||||
getgrgid_r getgrnam_r \
|
getgrgid_r getgrnam_r \
|
||||||
getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
|
getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
|
||||||
|
|
|
@ -3538,7 +3538,7 @@ fi
|
||||||
AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
|
AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
|
||||||
clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
|
clock confstr copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
|
||||||
faccessat fchmod fchmodat fchown fchownat \
|
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 \
|
futimens futimes gai_strerror getentropy \
|
||||||
getgrgid_r getgrnam_r \
|
getgrgid_r getgrnam_r \
|
||||||
getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
|
getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \
|
||||||
|
|
|
@ -337,6 +337,9 @@
|
||||||
/* Define to 1 if you have the `fdopendir' function. */
|
/* Define to 1 if you have the `fdopendir' function. */
|
||||||
#undef HAVE_FDOPENDIR
|
#undef HAVE_FDOPENDIR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `fdwalk' function. */
|
||||||
|
#undef HAVE_FDWALK
|
||||||
|
|
||||||
/* Define to 1 if you have the `fexecve' function. */
|
/* Define to 1 if you have the `fexecve' function. */
|
||||||
#undef HAVE_FEXECVE
|
#undef HAVE_FEXECVE
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue