diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 7e065c46a..7e733e49a 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -1118,7 +1118,7 @@ fhandler_pty_slave::reset_switch_to_pcon (void) if (WaitForSingleObject (h_gdb_process, 0) == WAIT_TIMEOUT) { if (isHybrid) - get_ttyp ()->wait_pcon_fwd (false); + get_ttyp ()->wait_pcon_fwd (); } else { @@ -2705,6 +2705,9 @@ fhandler_pty_master::pty_master_fwd_thread (const master_fwd_thread_param_t *p) for (;;) { p->ttyp->pcon_last_time = GetTickCount (); + DWORD n; + p->ttyp->pcon_fwd_not_empty = + ::bytes_available (n, p->from_slave_nat) && n; if (!ReadFile (p->from_slave_nat, outbuf, NT_MAX_PATH, &rlen, NULL)) { termios_printf ("ReadFile for forwarding failed, %E"); diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc index 789528856..da75b8dd2 100644 --- a/winsup/cygwin/tty.cc +++ b/winsup/cygwin/tty.cc @@ -240,6 +240,7 @@ tty::init () pcon_pid = 0; term_code_page = 0; pcon_last_time = 0; + pcon_fwd_not_empty = false; pcon_start = false; pcon_start_pid = 0; pcon_cap_checked = false; @@ -367,7 +368,7 @@ tty_min::setpgid (int pid) } void -tty::wait_pcon_fwd (bool init) +tty::wait_pcon_fwd () { /* The forwarding in pseudo console sometimes stops for 16-32 msec even if it already has data to transfer. @@ -377,11 +378,11 @@ tty::wait_pcon_fwd (bool init) thread when the last data is transfered. */ const int sleep_in_pcon = 16; const int time_to_wait = sleep_in_pcon * 2 + 1/* margine */; - if (init) - pcon_last_time = GetTickCount (); - while (GetTickCount () - pcon_last_time < time_to_wait) + int elapsed; + while (pcon_fwd_not_empty + || (elapsed = GetTickCount () - pcon_last_time) < time_to_wait) { - int tw = time_to_wait - (GetTickCount () - pcon_last_time); + int tw = pcon_fwd_not_empty ? 10 : (time_to_wait - elapsed); cygwait (tw); } } diff --git a/winsup/cygwin/tty.h b/winsup/cygwin/tty.h index 519d7c0d5..2cd12a665 100644 --- a/winsup/cygwin/tty.h +++ b/winsup/cygwin/tty.h @@ -116,6 +116,7 @@ private: DWORD pcon_pid; UINT term_code_page; DWORD pcon_last_time; + bool pcon_fwd_not_empty; HANDLE h_pcon_write_pipe; HANDLE h_pcon_condrv_reference; HANDLE h_pcon_conhost_process; @@ -166,7 +167,7 @@ public: void set_master_ctl_closed () {master_pid = -1;} static void __stdcall create_master (int); static void __stdcall init_session (); - void wait_pcon_fwd (bool init = true); + void wait_pcon_fwd (); bool pcon_input_state_eq (xfer_dir x) { return pcon_input_state == x; } bool pcon_fg (pid_t pgid); friend class fhandler_pty_common;