This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] Let pty slave detect closure of last master handle


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))


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]