* tty.h (tty::set_master_ctl_closed): Rename from set_master_closed.
(tty::is_master_closed): Drop method. * fhandler_tty.cc (fhandler_pty_slave::open): Remove code prematurely bailing out if master control thread is not running. (fhandler_pty_slave::read): Don't generate SIGHUP if master control thread is not running. (fhandler_pty_master::close): Rearrange code to avoid stopping master control thread twice in multi-threaded scenarios.
This commit is contained in:
parent
3bf693dde1
commit
5e99eb1104
@ -1,3 +1,14 @@
|
|||||||
|
2015-03-05 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* tty.h (tty::set_master_ctl_closed): Rename from set_master_closed.
|
||||||
|
(tty::is_master_closed): Drop method.
|
||||||
|
* fhandler_tty.cc (fhandler_pty_slave::open): Remove code prematurely
|
||||||
|
bailing out if master control thread is not running.
|
||||||
|
(fhandler_pty_slave::read): Don't generate SIGHUP if master control
|
||||||
|
thread is not running.
|
||||||
|
(fhandler_pty_master::close): Rearrange code to avoid stopping master
|
||||||
|
control thread twice in multi-threaded scenarios.
|
||||||
|
|
||||||
2015-03-05 Corinna Vinschen <corinna@vinschen.de>
|
2015-03-05 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler.h (fhandler_base::get_echo_handle): New virtual method.
|
* fhandler.h (fhandler_base::get_echo_handle): New virtual method.
|
||||||
|
@ -462,12 +462,6 @@ fhandler_pty_slave::open (int flags, mode_t)
|
|||||||
goto err_no_errno;
|
goto err_no_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_ttyp ()->is_master_closed ())
|
|
||||||
{
|
|
||||||
errmsg = "*** master is closed";
|
|
||||||
set_errno (EAGAIN);
|
|
||||||
goto err_no_errno;
|
|
||||||
}
|
|
||||||
/* Three case for duplicating the pipe handles:
|
/* Three case for duplicating the pipe handles:
|
||||||
- Either we're the master. In this case, just duplicate the handles.
|
- Either we're the master. In this case, just duplicate the handles.
|
||||||
- Or, we have the right to open the master process for handle duplication.
|
- Or, we have the right to open the master process for handle duplication.
|
||||||
@ -744,12 +738,6 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
|
|||||||
switch (cygwait (input_available_event, time_to_wait))
|
switch (cygwait (input_available_event, time_to_wait))
|
||||||
{
|
{
|
||||||
case WAIT_OBJECT_0:
|
case WAIT_OBJECT_0:
|
||||||
if (get_ttyp ()->is_master_closed ())
|
|
||||||
{
|
|
||||||
raise (SIGHUP);
|
|
||||||
totalread = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case WAIT_SIGNALED:
|
case WAIT_SIGNALED:
|
||||||
if (totalread > 0)
|
if (totalread > 0)
|
||||||
@ -1315,9 +1303,17 @@ fhandler_pty_master::close ()
|
|||||||
|
|
||||||
__small_sprintf (buf, "\\\\.\\pipe\\cygwin-%S-pty%d-master-ctl",
|
__small_sprintf (buf, "\\\\.\\pipe\\cygwin-%S-pty%d-master-ctl",
|
||||||
&cygheap->installation_key, get_minor ());
|
&cygheap->installation_key, get_minor ());
|
||||||
CallNamedPipe (buf, &req, sizeof req, &repl, sizeof repl, &len, 500);
|
acquire_output_mutex (INFINITE);
|
||||||
|
if (master_ctl)
|
||||||
|
{
|
||||||
|
CallNamedPipe (buf, &req, sizeof req, &repl, sizeof repl, &len,
|
||||||
|
500);
|
||||||
CloseHandle (master_ctl);
|
CloseHandle (master_ctl);
|
||||||
master_thread->detach ();
|
master_thread->detach ();
|
||||||
|
get_ttyp ()->set_master_ctl_closed ();
|
||||||
|
master_ctl = NULL;
|
||||||
|
}
|
||||||
|
release_output_mutex ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1334,11 +1330,6 @@ fhandler_pty_master::close ()
|
|||||||
|
|
||||||
if (have_execed || get_ttyp ()->master_pid != myself->pid)
|
if (have_execed || get_ttyp ()->master_pid != myself->pid)
|
||||||
termios_printf ("not clearing: %d, master_pid %d", have_execed, get_ttyp ()->master_pid);
|
termios_printf ("not clearing: %d, master_pid %d", have_execed, get_ttyp ()->master_pid);
|
||||||
else
|
|
||||||
{
|
|
||||||
get_ttyp ()->set_master_closed ();
|
|
||||||
SetEvent (input_available_event);
|
|
||||||
}
|
|
||||||
if (!ForceCloseHandle (input_available_event))
|
if (!ForceCloseHandle (input_available_event))
|
||||||
termios_printf ("CloseHandle (input_available_event<%p>), %E", input_available_event);
|
termios_printf ("CloseHandle (input_available_event<%p>), %E", input_available_event);
|
||||||
|
|
||||||
|
@ -12,3 +12,6 @@ Bug Fixes
|
|||||||
- Fix potential hang in pseudo ttys when generating ECHO output while the slave
|
- Fix potential hang in pseudo ttys when generating ECHO output while the slave
|
||||||
is flooding the pty with output.
|
is flooding the pty with output.
|
||||||
Addresses: https://cygwin.com/ml/cygwin/2015-03/msg00019.html
|
Addresses: https://cygwin.com/ml/cygwin/2015-03/msg00019.html
|
||||||
|
|
||||||
|
- Fix potential premature SIGHUP in pty code.
|
||||||
|
Addresses: https://cygwin.com/ml/cygwin/2015-03/msg00070.html
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* tty.h: shared tty info for cygwin
|
/* tty.h: shared tty info for cygwin
|
||||||
|
|
||||||
Copyright 2000, 2001, 2002, 2003, 2004, 2006, 2009, 2010, 2011, 2012, 2013
|
Copyright 2000, 2001, 2002, 2003, 2004, 2006, 2009, 2010, 2011, 2012, 2013,
|
||||||
Red Hat, Inc.
|
2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
@ -129,8 +129,7 @@ public:
|
|||||||
{ return open_mutex (INPUT_MUTEX, access); }
|
{ return open_mutex (INPUT_MUTEX, access); }
|
||||||
bool exists ();
|
bool exists ();
|
||||||
bool not_allocated (HANDLE&, HANDLE&);
|
bool not_allocated (HANDLE&, HANDLE&);
|
||||||
void set_master_closed () {master_pid = -1;}
|
void set_master_ctl_closed () {master_pid = -1;}
|
||||||
bool is_master_closed () const {return master_pid == -1;}
|
|
||||||
static void __stdcall create_master (int);
|
static void __stdcall create_master (int);
|
||||||
static void __stdcall init_session ();
|
static void __stdcall init_session ();
|
||||||
friend class fhandler_pty_master;
|
friend class fhandler_pty_master;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user