From: Lionel Sambuc Date: Fri, 25 Apr 2014 14:06:33 +0000 (+0200) Subject: usr.bin/make: -j fix X-Git-Tag: v3.3.0~402 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/pkcs11-destroy.html?a=commitdiff_plain;h=7d98eee859c9c87a282db2d34c657ede94f72582;p=minix.git usr.bin/make: -j fix The job option enable the usage of pipes to communicate with sub-makes. On MINIX, it seems that there is possibility of receiving an EAGAIN on such reads, even when it had previously been tested for POLLIN using poll(). This patch is a workaround, by wrapping the read operation within a do {} while(errno == EAGAIN && ...) loop. Change-Id: Ia184c4d600efe7218d197820df87761604120862 --- diff --git a/servers/vfs/pipe.c b/servers/vfs/pipe.c index eb61e3b6f..ea75afb07 100644 --- a/servers/vfs/pipe.c +++ b/servers/vfs/pipe.c @@ -394,13 +394,6 @@ int count; /* max number of processes to release */ f->filp_vno != vp) continue; - /* Do a pipe_check to see if we really want to callback this - * select; a close() doesn't always warrant it. - */ - if(pipe_check(f, op == VFS_READ ? READING : WRITING, - f->filp_flags, 1, 1) != EAGAIN) { - continue; - } select_callback(f, selop); f->filp_pipe_select_ops &= ~selop; diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c index 43df92375..c37ec6f20 100644 --- a/usr.bin/make/job.c +++ b/usr.bin/make/job.c @@ -1380,7 +1380,7 @@ JobExec(Job *job, char **argv) * by killing its process family, but not commit suicide. */ #if defined(MAKE_NATIVE) || defined(HAVE_SETPGID) -#if defined(SYSV) || defined(__minix) +#if defined(SYSV) /* XXX: dsl - I'm sure this should be setpgrp()... */ (void)setsid(); #else @@ -2061,7 +2061,15 @@ Job_CatchOutput(void) if (nready > 0 && readyfd(&childExitJob)) { char token = 0; ssize_t count; +#if defined(__minix) + /* Workaround: While the pipe is deemed ready to be read, it can still + * return EAGAIN in the read below. */ + do { +#endif /* defined(__minix) */ count = read(childExitJob.inPipe, &token, 1); +#if defined(__minix) + } while(-1 == count && EAGAIN == errno); +#endif /* defined(__minix) */ switch (count) { case 0: Punt("unexpected eof on token pipe");