]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44219: Release the GIL during isatty syscalls (GH-28250)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 9 Sep 2021 13:40:42 +0000 (06:40 -0700)
committerGitHub <noreply@github.com>
Thu, 9 Sep 2021 13:40:42 +0000 (06:40 -0700)
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@gmail.com>
Misc/NEWS.d/next/Core and Builtins/2021-09-09-10-32-33.bpo-44219.WiYyjz.rst [new file with mode: 0644]
Modules/posixmodule.c
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 (file)
index 0000000..12915ff
--- /dev/null
@@ -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.
index c984e2e93f3c0442b4f1835a79c9c6ea00d9c366..f2dcf965db76027854057d3dc6c70b1eb1c36eb1 100644 (file)
@@ -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;
 }
 
index 11c659d5a46faef8f971023362510705619ccd0f..d072363535c8011d45edaf6bd3872270f33d068e 100644 (file)
@@ -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) {