[Python-checkins] bpo-44219: Release the GIL during isatty syscalls (GH-28250)
miss-islington
webhook-mailer at python.org
Thu Sep 9 09:40:51 EDT 2021
https://github.com/python/cpython/commit/5c65834d801d6b4313eef0684a30e12c22ccfedd
commit: 5c65834d801d6b4313eef0684a30e12c22ccfedd
branch: 3.9
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2021-09-09T06:40:42-07:00
summary:
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 <vxgmichel at gmail.com>
files:
A Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst
M Modules/posixmodule.c
M Python/fileutils.c
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 0000000000000..12915ffe3c07c
--- /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 c984e2e93f3c0..f2dcf965db760 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 11c659d5a46fa..d072363535c80 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) {
More information about the Python-checkins
mailing list