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
			
			
This commit is contained in:
		
							parent
							
								
									ac9fa699bd
								
							
						
					
					
						commit
						7d98eee859
					
				| @ -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; | ||||
|  | ||||
| @ -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"); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Lionel Sambuc
						Lionel Sambuc