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:
Jakub Kulík 2019-09-11 17:11:57 +02:00 committed by Gregory P. Smith
parent af636f4f91
commit e20134f889
5 changed files with 32 additions and 2 deletions

View file

@ -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]
os.closerange
@ -8436,11 +8451,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;