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) | 		    f->filp_vno != vp) | ||||||
| 			continue; | 			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); | 		select_callback(f, selop); | ||||||
| 
 | 
 | ||||||
| 		f->filp_pipe_select_ops &= ~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. | 	 * by killing its process family, but not commit suicide. | ||||||
| 	 */ | 	 */ | ||||||
| #if defined(MAKE_NATIVE) || defined(HAVE_SETPGID) | #if defined(MAKE_NATIVE) || defined(HAVE_SETPGID) | ||||||
| #if defined(SYSV) || defined(__minix) | #if defined(SYSV) | ||||||
| 	/* XXX: dsl - I'm sure this should be setpgrp()... */ | 	/* XXX: dsl - I'm sure this should be setpgrp()... */ | ||||||
| 	(void)setsid(); | 	(void)setsid(); | ||||||
| #else | #else | ||||||
| @ -2061,7 +2061,15 @@ Job_CatchOutput(void) | |||||||
|     if (nready > 0 && readyfd(&childExitJob)) { |     if (nready > 0 && readyfd(&childExitJob)) { | ||||||
| 	char token = 0; | 	char token = 0; | ||||||
| 	ssize_t count; | 	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); | 	count = read(childExitJob.inPipe, &token, 1); | ||||||
|  | #if defined(__minix) | ||||||
|  | 	} while(-1 == count && EAGAIN == errno); | ||||||
|  | #endif /* defined(__minix) */ | ||||||
| 	switch (count) { | 	switch (count) { | ||||||
| 	case 0: | 	case 0: | ||||||
| 	    Punt("unexpected eof on token pipe"); | 	    Punt("unexpected eof on token pipe"); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Lionel Sambuc
						Lionel Sambuc