From f14d123ac62cfa93ef959154cf80bbced6c76958 Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Tue, 11 Aug 2020 13:16:52 +0900 Subject: [PATCH] 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. --- winsup/cygwin/spawn.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 840ec4a86..e70ceb86d 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -177,7 +177,7 @@ find_exec (const char *name, path_conv& buf, const char *search, /* Utility for child_info_spawn::worker. */ static HANDLE -handle (int fd, bool writing) +handle (int fd, bool writing, bool iscygwin) { HANDLE h; cygheap_fdget cfd (fd); @@ -188,6 +188,11 @@ handle (int fd, bool writing) h = INVALID_HANDLE_VALUE; else if (!writing) 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 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 */ si.dwFlags = STARTF_USESTDHANDLES; - si.hStdInput = handle ((in__stdin < 0 ? 0 : in__stdin), false); - si.hStdOutput = handle ((in__stdout < 0 ? 1 : in__stdout), true); - si.hStdError = handle (2, true); + si.hStdInput = handle ((in__stdin < 0 ? 0 : in__stdin), false, + iscygwin ()); + si.hStdOutput = handle ((in__stdout < 0 ? 1 : in__stdout), true, + iscygwin ()); + si.hStdError = handle (2, true, iscygwin ()); si.cb = sizeof (si);