Cygwin: pty: Add a workaround for issue of starting a lot of mintty.
- If a lot of mintty are started in a short time from a mintty, some
  of them hang with empty screen, crash immediately or hang on exiting
  mintty. The following report seems to be related to this issue.
    https://cygwin.com/pipermail/cygwin/2020-August/245751.html
  The cause is not clear at all, but this patch seems to solve the
  issue.
			
			
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							a44bc679a4
						
					
				
				
					commit
					f14d123ac6
				
			| @@ -177,7 +177,7 @@ find_exec (const char *name, path_conv& buf, const char *search, | |||||||
| /* Utility for child_info_spawn::worker.  */ | /* Utility for child_info_spawn::worker.  */ | ||||||
|  |  | ||||||
| static HANDLE | static HANDLE | ||||||
| handle (int fd, bool writing) | handle (int fd, bool writing, bool iscygwin) | ||||||
| { | { | ||||||
|   HANDLE h; |   HANDLE h; | ||||||
|   cygheap_fdget cfd (fd); |   cygheap_fdget cfd (fd); | ||||||
| @@ -188,6 +188,11 @@ handle (int fd, bool writing) | |||||||
|     h = INVALID_HANDLE_VALUE; |     h = INVALID_HANDLE_VALUE; | ||||||
|   else if (!writing) |   else if (!writing) | ||||||
|     h = cfd->get_handle (); |     h = cfd->get_handle (); | ||||||
|  |   else if (cfd->get_major () == DEV_PTYS_MAJOR && iscygwin) | ||||||
|  |     { | ||||||
|  |       fhandler_pty_slave *ptys = (fhandler_pty_slave *)(fhandler_base *) cfd; | ||||||
|  |       h = ptys->get_output_handle_cyg (); | ||||||
|  |     } | ||||||
|   else |   else | ||||||
|     h = cfd->get_output_handle (); |     h = cfd->get_output_handle (); | ||||||
|  |  | ||||||
| @@ -625,9 +630,11 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, | |||||||
|  |  | ||||||
|       /* Set up needed handles for stdio */ |       /* Set up needed handles for stdio */ | ||||||
|       si.dwFlags = STARTF_USESTDHANDLES; |       si.dwFlags = STARTF_USESTDHANDLES; | ||||||
|       si.hStdInput = handle ((in__stdin < 0 ? 0 : in__stdin), false); |       si.hStdInput = handle ((in__stdin < 0 ? 0 : in__stdin), false, | ||||||
|       si.hStdOutput = handle ((in__stdout < 0 ? 1 : in__stdout), true); | 			     iscygwin ()); | ||||||
|       si.hStdError = handle (2, true); |       si.hStdOutput = handle ((in__stdout < 0 ? 1 : in__stdout), true, | ||||||
|  | 			      iscygwin ()); | ||||||
|  |       si.hStdError = handle (2, true, iscygwin ()); | ||||||
|  |  | ||||||
|       si.cb = sizeof (si); |       si.cb = sizeof (si); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user