From: Mark Wooding Date: Sun, 19 Apr 2020 17:47:31 +0000 (+0100) Subject: src/jobclient.c: Cope if the jobserver pipe is set nonblocking. X-Git-Url: https://git.distorted.org.uk/~mdw/distorted-chroot/commitdiff_plain/4ff3ebbb8005414d72b2abd884f641c60917b725?hp=a323afdf371df04b036f18fee47b912ce42ce200 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. --- 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);