cpython: cad6eac598ec (original) (raw)
--- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -376,10 +376,12 @@ fileio_init(PyObject *oself, PyObject *a else #endif self->fd = open(name, flags, 0666); - Py_END_ALLOW_THREADS } while (self->fd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); +
if (async_err)[](#l1.12)
goto error;[](#l1.13) }[](#l1.14) else {[](#l1.15) PyObject *fdobj;[](#l1.16)
@@ -408,8 +410,7 @@ fileio_init(PyObject *oself, PyObject *a fd_is_own = 1; if (self->fd < 0) {
if (!async_err)[](#l1.21)
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);[](#l1.22)
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj);[](#l1.23) goto error;[](#l1.24) }[](#l1.25)
@@ -576,12 +577,15 @@ fileio_readinto(fileio *self, PyObject * if (_PyVerify_fd(self->fd)) { len = pbuf.len; +#ifdef MS_WINDOWS
if (len > INT_MAX)[](#l1.32)
len = INT_MAX;[](#l1.33)
+#endif + do { Py_BEGIN_ALLOW_THREADS errno = 0; #ifdef MS_WINDOWS
if (len > INT_MAX)[](#l1.40)
len = INT_MAX;[](#l1.41) n = read(self->fd, pbuf.buf, (int)len);[](#l1.42)
#else n = read(self->fd, pbuf.buf, len); @@ -589,6 +593,9 @@ fileio_readinto(fileio *self, PyObject * Py_END_ALLOW_THREADS } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); +
if (async_err)[](#l1.50)
} else n = -1; err = errno; @@ -597,8 +604,7 @@ fileio_readinto(fileio *self, PyObject * if (err == EAGAIN) Py_RETURN_NONE; errno = err;return NULL;[](#l1.51)
if (!async_err)[](#l1.59)
PyErr_SetFromErrno(PyExc_IOError);[](#l1.60)
} @@ -633,7 +639,7 @@ fileio_readall(fileio *self) Py_off_t pos, end; PyObject *result; Py_ssize_t bytes_read = 0;PyErr_SetFromErrno(PyExc_IOError);[](#l1.61) return NULL;[](#l1.62)
- Py_ssize_t len, n; size_t bufsize; int async_err = 0; @@ -682,20 +688,26 @@ fileio_readall(fileio *self) return NULL; } }
len = bufsize - bytes_read;[](#l1.79)
if (len > INT_MAX)[](#l1.81)
len = INT_MAX;[](#l1.82)
+#endif do { Py_BEGIN_ALLOW_THREADS errno = 0;
n = bufsize - bytes_read;[](#l1.87)
if (n > INT_MAX)[](#l1.89)
n = INT_MAX;[](#l1.90)
n = read(self->fd, PyBytes_AS_STRING(result) + bytes_read, (int)n);[](#l1.91)
n = read(self->fd, PyBytes_AS_STRING(result) + bytes_read, (int)len);[](#l1.92)
n = read(self->fd, PyBytes_AS_STRING(result) + bytes_read, n);[](#l1.94)
n = read(self->fd, PyBytes_AS_STRING(result) + bytes_read, len);[](#l1.95)
#endif Py_END_ALLOW_THREADS } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); +
if (async_err)[](#l1.101)
return NULL;[](#l1.102) if (n == 0)[](#l1.103) break;[](#l1.104) if (n < 0) {[](#l1.105)
@@ -706,8 +718,7 @@ fileio_readall(fileio *self) Py_RETURN_NONE; } Py_DECREF(result);
if (!async_err)[](#l1.110)
PyErr_SetFromErrno(PyExc_IOError);[](#l1.111)
PyErr_SetFromErrno(PyExc_IOError);[](#l1.112) return NULL;[](#l1.113) }[](#l1.114) bytes_read += n;[](#l1.115)
@@ -775,6 +786,9 @@ fileio_read(fileio *self, PyObject *args Py_END_ALLOW_THREADS } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); +
@@ -784,8 +798,7 @@ fileio_read(fileio *self, PyObject *args if (err == EAGAIN) Py_RETURN_NONE; errno = err;
if (!async_err)[](#l1.130)
PyErr_SetFromErrno(PyExc_IOError);[](#l1.131)
} @@ -815,19 +828,22 @@ fileio_write(fileio *self, PyObject *arg return NULL;PyErr_SetFromErrno(PyExc_IOError);[](#l1.132) return NULL;[](#l1.133)
len = pbuf.len;[](#l1.140)
if (len > 32767 && isatty(self->fd)) {[](#l1.142)
/* Issue #11395: the Windows console returns an error (12: not[](#l1.143)
enough space error) on writing into stdout if stdout mode is[](#l1.144)
binary and the length is greater than 66,000 bytes (or less,[](#l1.145)
depending on heap usage). */[](#l1.146)
len = 32767;[](#l1.147)
} else if (len > INT_MAX)[](#l1.148)
len = INT_MAX;[](#l1.149)
+#endif + do { Py_BEGIN_ALLOW_THREADS errno = 0;
len = pbuf.len;[](#l1.155)
if (len > 32767 && isatty(self->fd)) {[](#l1.157)
/* Issue #11395: the Windows console returns an error (12: not[](#l1.158)
enough space error) on writing into stdout if stdout mode is[](#l1.159)
binary and the length is greater than 66,000 bytes (or less,[](#l1.160)
depending on heap usage). */[](#l1.161)
len = 32767;[](#l1.162)
} else if (len > INT_MAX)[](#l1.163)
len = INT_MAX;[](#l1.164) n = write(self->fd, pbuf.buf, (int)len);[](#l1.165)
#else n = write(self->fd, pbuf.buf, len); @@ -835,6 +851,9 @@ fileio_write(fileio *self, PyObject *arg Py_END_ALLOW_THREADS } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); +
if (async_err)[](#l1.173)
} else n = -1; err = errno; @@ -845,8 +864,7 @@ fileio_write(fileio *self, PyObject *arg if (err == EAGAIN) Py_RETURN_NONE; errno = err;return NULL;[](#l1.174)
if (!async_err)[](#l1.182)
PyErr_SetFromErrno(PyExc_IOError);[](#l1.183)