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:
Gregory P. Smith 2012-10-12 13:02:06 -07:00
parent 2aa5afab4e
commit 99716166b1
7 changed files with 293 additions and 8 deletions

View file

@ -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;