unix/file: If write syscall returns because of EINTR then try again.

As per PEP-475.
This commit is contained in:
Damien George 2016-05-04 09:22:22 +00:00
parent e33806aaff
commit f1b6db2218

View File

@ -88,6 +88,14 @@ STATIC mp_uint_t fdfile_write(mp_obj_t o_in, const void *buf, mp_uint_t size, in
} }
#endif #endif
mp_int_t r = write(o->fd, buf, size); mp_int_t r = write(o->fd, buf, size);
while (r == -1 && errno == EINTR) {
if (MP_STATE_VM(mp_pending_exception) != MP_OBJ_NULL) {
mp_obj_t obj = MP_STATE_VM(mp_pending_exception);
MP_STATE_VM(mp_pending_exception) = MP_OBJ_NULL;
nlr_raise(obj);
}
r = write(o->fd, buf, size);
}
if (r == -1) { if (r == -1) {
*errcode = errno; *errcode = errno;
return MP_STREAM_ERROR; return MP_STREAM_ERROR;