From f1b6db221875f6ad30ff0723f2c2302aeab70d0e Mon Sep 17 00:00:00 2001 From: Damien George Date: Wed, 4 May 2016 09:22:22 +0000 Subject: [PATCH] unix/file: If write syscall returns because of EINTR then try again. As per PEP-475. --- unix/file.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unix/file.c b/unix/file.c index 7a23572e13..a7620e079e 100644 --- a/unix/file.c +++ b/unix/file.c @@ -88,6 +88,14 @@ STATIC mp_uint_t fdfile_write(mp_obj_t o_in, const void *buf, mp_uint_t size, in } #endif 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) { *errcode = errno; return MP_STREAM_ERROR;