mirror of
https://github.com/python/cpython.git
synced 2025-11-20 02:50:14 +00:00
Fixes Issue #12268 for the io module - File readline, readlines and
read or readall methods no longer lose data when an underlying read system call is interrupted within an io module object. IOError is no longer raised due to a read system call returning EINTR from within these methods. This is a backport of changeset 781b95159954 from 3.2. The earlier 2.7 changeset 67dc99a989cd already fixed this for the builtin python 2.x file object.
This commit is contained in:
parent
2aa5afab4e
commit
99716166b1
7 changed files with 293 additions and 8 deletions
|
|
@ -710,8 +710,8 @@ _buffered_init(buffered *self)
|
|||
clears the error indicator), 0 otherwise.
|
||||
Should only be called when PyErr_Occurred() is true.
|
||||
*/
|
||||
static int
|
||||
_trap_eintr(void)
|
||||
int
|
||||
_PyIO_trap_eintr(void)
|
||||
{
|
||||
static PyObject *eintr_int = NULL;
|
||||
PyObject *typ, *val, *tb;
|
||||
|
|
@ -1296,7 +1296,7 @@ _bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len)
|
|||
*/
|
||||
do {
|
||||
res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readinto, memobj, NULL);
|
||||
} while (res == NULL && _trap_eintr());
|
||||
} while (res == NULL && _PyIO_trap_eintr());
|
||||
Py_DECREF(memobj);
|
||||
if (res == NULL)
|
||||
return -1;
|
||||
|
|
@ -1723,7 +1723,7 @@ _bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len)
|
|||
errno = 0;
|
||||
res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_write, memobj, NULL);
|
||||
errnum = errno;
|
||||
} while (res == NULL && _trap_eintr());
|
||||
} while (res == NULL && _PyIO_trap_eintr());
|
||||
Py_DECREF(memobj);
|
||||
if (res == NULL)
|
||||
return -1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue