* cygthread.cc (cygthread::exit_thread): Define new method.
* cygthread.h (cygthread::exit_thread): Declare new method. * fhandler.h (fhandler_tty_master::hThread): Delete. (fhandler_tty_master::output_thread): Define. * fhandler_tty.cc (fhandler_tty_master::fhandler_tty_master): Adjust constructor. (fhandler_tty_master::init): Use cygthread rather than handle. (process_output): Use cygthread method to exit. (fhandler_tty_master::fixup_after_fork): Set output_thread to NULL after fork. (fhandler_tty_master::fixup_after_exec): Set output_thread to NULL after spawn/exec. * tty.cc (tty_list::terminate): Detach from output_thread using cygthread method.
This commit is contained in:
@ -37,7 +37,7 @@ static DWORD WINAPI process_output (void *); // Output queue thread
|
||||
static DWORD WINAPI process_ioctl (void *); // Ioctl requests thread
|
||||
|
||||
fhandler_tty_master::fhandler_tty_master (int unit)
|
||||
: fhandler_pty_master (FH_TTYM, unit), console (NULL), hThread (NULL)
|
||||
: fhandler_pty_master (FH_TTYM, unit), console (NULL), output_thread (NULL)
|
||||
{
|
||||
}
|
||||
|
||||
@ -69,9 +69,8 @@ fhandler_tty_master::init (int ntty)
|
||||
h = new cygthread (process_ioctl, NULL, "ttyioctl");
|
||||
SetThreadPriority (*h, THREAD_PRIORITY_HIGHEST);
|
||||
|
||||
h = new cygthread (process_output, NULL, "ttyout");
|
||||
hThread = *h;
|
||||
SetThreadPriority (h, THREAD_PRIORITY_HIGHEST);
|
||||
output_thread = new cygthread (process_output, NULL, "ttyout");
|
||||
SetThreadPriority (*output_thread, THREAD_PRIORITY_HIGHEST);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -377,15 +376,13 @@ process_output (void *)
|
||||
for (;;)
|
||||
{
|
||||
int n = tty_master->process_slave_output (buf, OUT_BUFFER_SIZE, 0);
|
||||
if (n < 0)
|
||||
if (n <= 0)
|
||||
{
|
||||
termios_printf ("ReadFile %E");
|
||||
ExitThread (0);
|
||||
}
|
||||
if (n == 0)
|
||||
{
|
||||
/* End of file. */
|
||||
ExitThread (0);
|
||||
if (n < 0)
|
||||
termios_printf ("ReadFile %E");
|
||||
cygthread *t = tty_master->output_thread;
|
||||
tty_master->output_thread = NULL;
|
||||
t->exit_thread ();
|
||||
}
|
||||
n = tty_master->console->write ((void *) buf, (size_t) n);
|
||||
tty_master->get_ttyp ()->write_error = n == -1 ? get_errno () : 0;
|
||||
@ -1186,6 +1183,7 @@ fhandler_tty_master::fixup_after_fork (HANDLE child)
|
||||
{
|
||||
this->fhandler_pty_master::fixup_after_fork (child);
|
||||
console->fixup_after_fork (child);
|
||||
output_thread = NULL; // It's unreachable now
|
||||
}
|
||||
|
||||
void
|
||||
@ -1193,7 +1191,7 @@ fhandler_tty_master::fixup_after_exec (HANDLE)
|
||||
{
|
||||
console->close ();
|
||||
init_console ();
|
||||
return;
|
||||
output_thread = NULL; // It's unreachable now
|
||||
}
|
||||
|
||||
int
|
||||
|
Reference in New Issue
Block a user