From e93c7cb571f20a79efd561d430ab4cb38e01a635 Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Fri, 4 Mar 2022 14:42:46 +0900 Subject: [PATCH] Cygwin: pty: Rearrange reset_switch_to_nat_pipe() calls. - Previously, reset_switch_to_nat_pipe() is called from many places in pty code. This patch reorganizes that. With this patch, it is called only from bg_check() and setpgid_aux(). The calls which does not have enough reason have been omitted. --- winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_tty.cc | 22 ++++++++++------------ winsup/cygwin/select.cc | 2 -- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index c32dc7b57..e7cf17df0 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -2378,6 +2378,7 @@ class fhandler_pty_slave: public fhandler_pty_common select_record *select_read (select_stuff *); select_record *select_write (select_stuff *); select_record *select_except (select_stuff *); + bg_check_types bg_check (int sig, bool dontsignal = false); virtual char const *ttyname () { return pc.dev.name (); } int __reg2 fstat (struct stat *buf); int __reg3 facl (int, int, struct acl *); diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index b96a7b3cf..76c5e2413 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -1287,8 +1287,6 @@ fhandler_pty_slave::write (const void *ptr, size_t len) push_process_state process_state (PID_TTYOU); - reset_switch_to_nat_pipe (); - acquire_output_mutex (mutex_timeout); if (!process_opost_output (get_output_handle (), ptr, towrite, false, get_ttyp (), is_nonblocking ())) @@ -1409,10 +1407,7 @@ fhandler_pty_slave::read (void *ptr, size_t& len) push_process_state process_state (PID_TTYIN); if (ptr) /* Indicating not tcflush(). */ - { - mask_switch_to_nat_pipe (true, true); - reset_switch_to_nat_pipe (); - } + mask_switch_to_nat_pipe (true, true); if (is_nonblocking () || !ptr) /* Indicating tcflush(). */ time_to_wait = 0; @@ -1669,7 +1664,6 @@ fhandler_pty_master::dup (fhandler_base *child, int) int fhandler_pty_slave::tcgetattr (struct termios *t) { - reset_switch_to_nat_pipe (); *t = get_ttyp ()->ti; /* Workaround for rlwrap */ @@ -1690,7 +1684,6 @@ fhandler_pty_slave::tcgetattr (struct termios *t) int fhandler_pty_slave::tcsetattr (int, const struct termios *t) { - reset_switch_to_nat_pipe (); acquire_output_mutex (mutex_timeout); get_ttyp ()->ti = *t; release_output_mutex (); @@ -1704,8 +1697,6 @@ fhandler_pty_slave::tcflush (int queue) termios_printf ("tcflush(%d) handle %p", queue, get_handle ()); - reset_switch_to_nat_pipe (); - if (queue == TCIFLUSH || queue == TCIOFLUSH) { size_t len = UINT_MAX; @@ -1725,7 +1716,6 @@ int fhandler_pty_slave::ioctl (unsigned int cmd, void *arg) { termios_printf ("ioctl (%x)", cmd); - reset_switch_to_nat_pipe (); int res = fhandler_termios::ioctl (cmd, arg); if (res <= 0) return res; @@ -2489,6 +2479,13 @@ fhandler_pty_slave::setup_locale (void) } } +bg_check_types +fhandler_pty_slave::bg_check (int sig, bool dontsignal) +{ + reset_switch_to_nat_pipe (); + return fhandler_termios::bg_check (sig, dontsignal); +} + void fhandler_pty_slave::fixup_after_fork (HANDLE parent) { @@ -2500,7 +2497,6 @@ fhandler_pty_slave::fixup_after_fork (HANDLE parent) void fhandler_pty_slave::fixup_after_exec () { - reset_switch_to_nat_pipe (); create_invisible_console (); if (!close_on_exec ()) @@ -4106,6 +4102,8 @@ fhandler_pty_slave::cleanup_for_non_cygwin_app (handle_set_t *p, tty *ttyp, void fhandler_pty_slave::setpgid_aux (pid_t pid) { + reset_switch_to_nat_pipe (); + WaitForSingleObject (pipe_sw_mutex, INFINITE); bool was_nat_fg = get_ttyp ()->nat_fg (tc ()->pgid); bool nat_fg = get_ttyp ()->nat_fg (pid); diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 64e35cf12..4f23dfdef 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -1353,8 +1353,6 @@ peek_pty_slave (select_record *s, bool from_select) fhandler_base *fh = (fhandler_base *) s->fh; fhandler_pty_slave *ptys = (fhandler_pty_slave *) fh; - ptys->reset_switch_to_nat_pipe (); - if (s->read_selected) { if (s->read_ready)