From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Sep 2021 13:40:42 +0000 (-0700) Subject: bpo-44219: Release the GIL during isatty syscalls (GH-28250) X-Git-Tag: v3.9.8~178 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c65834d801d6b4313eef0684a30e12c22ccfedd;p=thirdparty%2FPython%2Fcpython.git bpo-44219: Release the GIL during isatty syscalls (GH-28250) Release the GIL while performing isatty() system calls on arbitrary file descriptors. In particular, this affects os.isatty(), os.device_encoding() and io.TextIOWrapper. By extension, io.open() in text mode is also affected. (cherry picked from commit 06148b1870fceb1a21738761b8e1ac3bf654319b) Co-authored-by: Vincent Michel --- diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst new file mode 100644 index 000000000000..12915ffe3c07 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst @@ -0,0 +1,4 @@ +Release the GIL while performing ``isatty`` system calls on arbitrary file +descriptors. In particular, this affects :func:`os.isatty`, +:func:`os.device_encoding` and :class:`io.TextIOWrapper`. By extension, +:func:`io.open` in text mode is also affected. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c984e2e93f3c..f2dcf965db76 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10058,9 +10058,11 @@ os_isatty_impl(PyObject *module, int fd) /*[clinic end generated code: output=6a48c8b4e644ca00 input=08ce94aa1eaf7b5e]*/ { int return_value; + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH return_value = isatty(fd); _Py_END_SUPPRESS_IPH + Py_END_ALLOW_THREADS return return_value; } diff --git a/Python/fileutils.c b/Python/fileutils.c index 11c659d5a46f..d072363535c8 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -69,9 +69,11 @@ _Py_device_encoding(int fd) UINT cp; #endif int valid; + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH valid = isatty(fd); _Py_END_SUPPRESS_IPH + Py_END_ALLOW_THREADS if (!valid) Py_RETURN_NONE; @@ -1737,12 +1739,22 @@ _Py_write_impl(int fd, const void *buf, size_t count, int gil_held) _Py_BEGIN_SUPPRESS_IPH #ifdef MS_WINDOWS - if (count > 32767 && isatty(fd)) { + if (count > 32767) { /* Issue #11395: the Windows console returns an error (12: not enough space error) on writing into stdout if stdout mode is binary and the length is greater than 66,000 bytes (or less, depending on heap usage). */ - count = 32767; + if (gil_held) { + Py_BEGIN_ALLOW_THREADS + if (isatty(fd)) { + count = 32767; + } + Py_END_ALLOW_THREADS + } else { + if (isatty(fd)) { + count = 32767; + } + } } #endif if (count > _PY_WRITE_MAX) {