diff -r 60ac28b612af Modules/fcntlmodule.c --- a/Modules/fcntlmodule.c Sat Apr 09 11:32:58 2016 +0200 +++ b/Modules/fcntlmodule.c Sat Apr 09 11:51:38 2016 +0200 @@ -285,9 +285,18 @@ fcntl_flock_impl(PyModuleDef *module, in int ret; #ifdef HAVE_FLOCK - Py_BEGIN_ALLOW_THREADS - ret = flock(fd, code); - Py_END_ALLOW_THREADS + while (1) { + Py_BEGIN_ALLOW_THREADS + ret = flock(fd, code); + Py_END_ALLOW_THREADS + + if (!(ret < 0 && errno == EINTR)) { + break; + } + if (PyErr_CheckSignals()) { + return NULL; + } + } #else #ifndef LOCK_SH @@ -310,9 +319,19 @@ fcntl_flock_impl(PyModuleDef *module, in return NULL; } l.l_whence = l.l_start = l.l_len = 0; - Py_BEGIN_ALLOW_THREADS - ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); - Py_END_ALLOW_THREADS + + while (1) { + Py_BEGIN_ALLOW_THREADS + ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); + Py_END_ALLOW_THREADS + + if (!(ret < 0 && errno == EINTR)) { + break; + } + if (PyErr_CheckSignals()) { + return NULL; + } + } } #endif /* HAVE_FLOCK */ if (ret < 0) { @@ -407,9 +426,19 @@ fcntl_lockf_impl(PyModuleDef *module, in return NULL; } l.l_whence = whence; - Py_BEGIN_ALLOW_THREADS - ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); - Py_END_ALLOW_THREADS + + while (1) { + Py_BEGIN_ALLOW_THREADS + ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); + Py_END_ALLOW_THREADS + + if (!(ret < 0 && errno == EINTR)) { + break; + } + if (PyErr_CheckSignals()) { + return NULL; + } + } } if (ret < 0) { PyErr_SetFromErrno(PyExc_IOError);