From 4ff3ebbb8005414d72b2abd884f641c60917b725 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 19 Apr 2020 18:47:31 +0100 Subject: [PATCH] src/jobclient.c: Cope if the jobserver pipe is set nonblocking. The GNU Make manual says this doesn't happen, but the source code and actual behaviour say differently. --- src/jobclient.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/jobclient.c b/src/jobclient.c index bc8d858..02141d4 100644 --- a/src/jobclient.c +++ b/src/jobclient.c @@ -33,6 +33,7 @@ #include #include +#include #include #define PY_SSIZE_T_CLEAN @@ -52,6 +53,7 @@ static PyObject *pymeth_jobclient(PyObject *me, PyObject *arg) PyObject *rc = 0; struct sigaction sa, oldsa; sigset_t mask, oldmask; + fd_set infd; int rstrchld = 0; int fd, sfd; int kid, st; @@ -101,7 +103,11 @@ again: * like this happens, then we go back and try reaping children again. */ Py_BEGIN_ALLOW_THREADS - n = read(sigfd, &ch, 1); + for (;;) { + n = read(sigfd, &ch, 1); if (n >= 0 || errno != EAGAIN) break; + FD_ZERO(&infd); FD_SET(sigfd, &infd); + n = select(sigfd + 1, &infd, 0, 0, 0); if (n < 0) break; + } Py_END_ALLOW_THREADS if (n == 1) rc = Py_BuildValue("(cOO)", ch, Py_None, Py_None); else if (!n) rc = Py_BuildValue("(sOO)", "", Py_None, Py_None); -- 2.11.0