From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7868) id B2D53385801E; Sun, 13 Feb 2022 15:18:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B2D53385801E Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Takashi Yano To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: pty: Revise the code to wait for completion of forwarding. X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/master X-Git-Oldrev: bddd9c1c417e97791c44241cf94753e90464501c X-Git-Newrev: b958e1f03acd1732bb0a433a589efb645458aac4 Message-Id: <20220213151844.B2D53385801E@sourceware.org> Date: Sun, 13 Feb 2022 15:18:44 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Feb 2022 15:18:44 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3Db958e1f03ac= d1732bb0a433a589efb645458aac4 commit b958e1f03acd1732bb0a433a589efb645458aac4 Author: Takashi Yano Date: Thu Feb 10 17:47:51 2022 +0900 Cygwin: pty: Revise the code to wait for completion of forwarding. =20 - With this patch, the code to wait for completion of forwarding of output from non-cygwin app is revised so that it can more reliably detect the completion. Diff: --- winsup/cygwin/fhandler_tty.cc | 5 ++++- winsup/cygwin/tty.cc | 11 ++++++----- winsup/cygwin/tty.h | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) 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) =3D=3D 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 mas= ter_fwd_thread_param_t *p) for (;;) { p->ttyp->pcon_last_time =3D GetTickCount (); + DWORD n; + p->ttyp->pcon_fwd_not_empty =3D + ::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 =3D 0; term_code_page =3D 0; pcon_last_time =3D 0; + pcon_fwd_not_empty =3D false; pcon_start =3D false; pcon_start_pid =3D 0; pcon_cap_checked =3D false; @@ -367,7 +368,7 @@ tty_min::setpgid (int pid) } =20 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 =3D 16; const int time_to_wait =3D sleep_in_pcon * 2 + 1/* margine */; - if (init) - pcon_last_time =3D GetTickCount (); - while (GetTickCount () - pcon_last_time < time_to_wait) + int elapsed; + while (pcon_fwd_not_empty + || (elapsed =3D GetTickCount () - pcon_last_time) < time_to_wait) { - int tw =3D time_to_wait - (GetTickCount () - pcon_last_time); + int tw =3D 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 =3D -1;} static void __stdcall create_master (int); static void __stdcall init_session (); - void wait_pcon_fwd (bool init =3D true); + void wait_pcon_fwd (); bool pcon_input_state_eq (xfer_dir x) { return pcon_input_state =3D=3D x= ; } bool pcon_fg (pid_t pgid); friend class fhandler_pty_common;