[newlib-cygwin] Let pty slave detect closure of last master handle
Corinna Vinschen
corinna@sourceware.org
Thu Mar 12 14:50:00 GMT 2015
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=32fd5b0fe1548cff79b9868e4e259853c59a44db
commit 32fd5b0fe1548cff79b9868e4e259853c59a44db
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date: Thu Mar 12 15:48:10 2015 +0100
Let pty slave detect closure of last master handle
* fhandler_tty.cc (fhandler_pty_master::close): Add code to make slave
detect closure of master. Fix typo in error message.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/ChangeLog | 5 +++++
winsup/cygwin/fhandler_tty.cc | 12 +++++++++---
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d63b359..e1e6a58 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2015-03-12 Takashi Yano <takashi.yano@nifty.ne.jp>
+
+ * fhandler_tty.cc (fhandler_pty_master::close): Add code to make slave
+ detect closure of master. Fix typo in error message.
+
2015-03-11 Corinna Vinschen <corinna@vinschen.de>
* include/cygwin/types.h: Include <sys/_timespec.h>
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index c7c90e2..87bd6a0 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -1317,17 +1317,23 @@ fhandler_pty_master::close ()
}
}
+ fhandler_pty_common::close ();
+
+ /* Check if the last master handle has been closed. If so, set
+ input_available_event to wake up potentially waiting slaves. */
+ if (!PeekNamedPipe (from_master, NULL, 0, NULL, NULL, NULL)
+ && GetLastError () == ERROR_BROKEN_PIPE)
+ SetEvent (input_available_event);
+
if (!ForceCloseHandle (from_master))
termios_printf ("error closing from_master %p, %E", from_master);
if (!ForceCloseHandle (to_master))
- termios_printf ("error closing from_master %p, %E", to_master);
+ termios_printf ("error closing to_master %p, %E", to_master);
from_master = to_master = NULL;
ForceCloseHandle (echo_r);
ForceCloseHandle (echo_w);
echo_r = echo_w = NULL;
- fhandler_pty_common::close ();
-
if (have_execed || get_ttyp ()->master_pid != myself->pid)
termios_printf ("not clearing: %d, master_pid %d", have_execed, get_ttyp ()->master_pid);
if (!ForceCloseHandle (input_available_event))
More information about the Cygwin-cvs
mailing list