summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-05-28 16:06:49 +0200
committerCorinna Vinschen <corinna@vinschen.de>2015-05-28 16:06:49 +0200
commitc978034e50fcbe559ace49b28c9cac1b28a663d6 (patch)
tree765cd1e01d149ea633e7134230e9799a34ba374c
parentd337c37417a3358fa54afac0c1b395bf93f3f01f (diff)
downloadcygnal-c978034e50fcbe559ace49b28c9cac1b28a663d6.tar.gz
cygnal-c978034e50fcbe559ace49b28c9cac1b28a663d6.tar.bz2
cygnal-c978034e50fcbe559ace49b28c9cac1b28a663d6.zip
Use NtQueryObject to detect closing the last master handle
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/fhandler_tty.cc29
2 files changed, 29 insertions, 8 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 42f34d7bc..c8d1470d9 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,11 @@
+2015-05-28 Takashi Yano <takashi.yano@nifty.ne.jp>
+ Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler_tty.cc (fhandler_pty_common::close): Don't close output_mutex
+ here. Move into callers.
+ (fhandler_pty_master::close): Use NtQueryObject instead of PeekNamedPipe
+ to detect closing the last master handle.
+
2015-05-27 Takashi Yano <takashi.yano@nifty.ne.jp>
* net.cc: Define _NETIOAPI_H_ to accomodate newer w32api.
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index e91b3e398..b74c39799 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -552,7 +552,10 @@ fhandler_pty_slave::close ()
get_output_handle_cyg ());
if ((unsigned) myself->ctty == FHDEV (DEV_PTYS_MAJOR, get_minor ()))
fhandler_console::free_console (); /* assumes that we are the last pty closer */
- return fhandler_pty_common::close ();
+ fhandler_pty_common::close ();
+ if (!ForceCloseHandle (output_mutex))
+ termios_printf ("CloseHandle (output_mutex<%p>), %E", output_mutex);
+ return 0;
}
int
@@ -1259,8 +1262,6 @@ fhandler_pty_common::close ()
termios_printf ("pty%d <%p,%p> closing", get_minor (), get_handle (), get_output_handle ());
if (!ForceCloseHandle (input_mutex))
termios_printf ("CloseHandle (input_mutex<%p>), %E", input_mutex);
- if (!ForceCloseHandle (output_mutex))
- termios_printf ("CloseHandle (output_mutex<%p>), %E", output_mutex);
if (!ForceCloseHandle1 (get_handle (), from_pty))
termios_printf ("CloseHandle (get_handle ()<%p>), %E", get_handle ());
if (!ForceCloseHandle1 (get_output_handle (), to_pty))
@@ -1281,6 +1282,9 @@ fhandler_pty_master::cleanup ()
int
fhandler_pty_master::close ()
{
+ OBJECT_BASIC_INFORMATION obi;
+ NTSTATUS status;
+
termios_printf ("closing from_master(%p)/to_master(%p)/to_master_cyg(%p) since we own them(%u)",
from_master, to_master, to_master_cyg, dwProcessId);
if (cygwin_finished_initializing)
@@ -1309,13 +1313,22 @@ 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);
+ acquire_output_mutex (INFINITE);
+ status = NtQueryObject (get_output_handle (), ObjectBasicInformation,
+ &obi, sizeof obi, NULL);
+ fhandler_pty_common::close ();
+ release_output_mutex ();
+ if (!ForceCloseHandle (output_mutex))
+ termios_printf ("CloseHandle (output_mutex<%p>), %E", output_mutex);
+ if (!NT_SUCCESS (status))
+ debug_printf ("NtQueryObject: %y", status);
+ else if (obi.HandleCount == 1)
+ {
+ termios_printf("Closing last master of pty%d", get_minor ());
+ SetEvent (input_available_event);
+ }
if (!ForceCloseHandle (from_master))
termios_printf ("error closing from_master %p, %E", from_master);