From: Victor Stinner Date: Thu, 19 Mar 2015 22:33:09 +0000 (+0100) Subject: Issue #23708: select.devpoll now retries its internal write() when interrupted X-Git-Tag: v3.5.0a3~127^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=54799672dad9e6a10adde0f4af87d9f8165e4d7a;p=python Issue #23708: select.devpoll now retries its internal write() when interrupted by a signal (EINTR). Modify devpoll_flush() to use _Py_write() instead of calling directly write(). --- diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index ef53067ac4..a65af2ff34 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -718,14 +718,10 @@ static int devpoll_flush(devpollObject *self) size = sizeof(struct pollfd)*self->n_fds; self->n_fds = 0; - Py_BEGIN_ALLOW_THREADS - n = write(self->fd_devpoll, self->fds, size); - Py_END_ALLOW_THREADS - - if (n == -1 ) { - PyErr_SetFromErrno(PyExc_IOError); + n = _Py_write(self->fd_devpoll, self->fds, size); + if (n == -1) return -1; - } + if (n < size) { /* ** Data writed to /dev/poll is a binary data structure. It is not