diff options
author | Vincent Michel <vxgmichel@gmail.com> | 2021-09-09 13:12:03 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-09 13:12:03 (GMT) |
commit | 06148b1870fceb1a21738761b8e1ac3bf654319b (patch) | |
tree | 183f403c348be7ed36f8fc93ec63c32c46688e68 /Python | |
parent | 04676b69466d2e6d2903f1c6879d2cb292721455 (diff) | |
download | cpython-06148b1870fceb1a21738761b8e1ac3bf654319b.zip cpython-06148b1870fceb1a21738761b8e1ac3bf654319b.tar.gz cpython-06148b1870fceb1a21738761b8e1ac3bf654319b.tar.bz2 |
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.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/fileutils.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/Python/fileutils.c b/Python/fileutils.c index e8a7eda..9e732dd 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -67,9 +67,11 @@ PyObject * _Py_device_encoding(int fd) { 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; @@ -1776,12 +1778,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) { |