diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2020-08-11 13:16:52 +0900 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2020-08-11 12:19:33 +0200 |
commit | f14d123ac62cfa93ef959154cf80bbced6c76958 (patch) | |
tree | 368eb4238d1990bea35219511fd1bf0dcc4bf1e0 | |
parent | a44bc679a47403e5439ae46106a886fcb6240233 (diff) | |
download | newlib-f14d123ac62cfa93ef959154cf80bbced6c76958.zip newlib-f14d123ac62cfa93ef959154cf80bbced6c76958.tar.gz newlib-f14d123ac62cfa93ef959154cf80bbced6c76958.tar.bz2 |
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.
-rw-r--r-- | winsup/cygwin/spawn.cc | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 840ec4a..e70ceb8 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); |