Skip to content

Commit

Permalink
Merge branch 'backports-from-cygwin-3_5-branch'
Browse files Browse the repository at this point in the history
This includes the pull request #72 from
dscho/restore-pipes-blocking-mode, and adds two more backported patches.

Signed-off-by: Johannes Schindelin <[email protected]>
  • Loading branch information
dscho committed Sep 25, 2024
2 parents faebbcd + 9d0d6e1 commit 1e8cf1a
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 10 deletions.
8 changes: 6 additions & 2 deletions winsup/cygwin/fhandler/console.cc
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,7 @@ fhandler_console::set_input_mode (tty::cons_mode m, const termios *t,
GetConsoleMode (p->input_handle, &oflags);
DWORD flags = oflags
& (ENABLE_EXTENDED_FLAGS | ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE);
con.curr_input_mode = m;
switch (m)
{
case tty::restore:
Expand Down Expand Up @@ -867,6 +868,7 @@ fhandler_console::set_output_mode (tty::cons_mode m, const termios *t,
if (con.orig_virtual_terminal_processing_mode)
flags |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
WaitForSingleObject (p->output_mutex, mutex_timeout);
con.curr_output_mode = m;
switch (m)
{
case tty::restore:
Expand Down Expand Up @@ -1109,12 +1111,12 @@ fhandler_console::bg_check (int sig, bool dontsignal)
/* Setting-up console mode for cygwin app. This is necessary if the
cygwin app and other non-cygwin apps are started simultaneously
in the same process group. */
if (sig == SIGTTIN)
if (sig == SIGTTIN && con.curr_input_mode != tty::cygwin)
{
set_input_mode (tty::cygwin, &tc ()->ti, get_handle_set ());
set_disable_master_thread (false, this);
}
if (sig == SIGTTOU)
if (sig == SIGTTOU && con.curr_output_mode != tty::cygwin)
set_output_mode (tty::cygwin, &tc ()->ti, get_handle_set ());

return fhandler_termios::bg_check (sig, dontsignal);
Expand Down Expand Up @@ -2921,6 +2923,8 @@ fhandler_console::char_command (char c)
}
if (con.args[i] == 1) /* DECCKM */
con.cursor_key_app_mode = (c == 'h');
if (con.args[i] == 9001) /* win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md) */
set_disable_master_thread (c == 'h', this);
}
/* Call fix_tab_position() if screen has been alternated. */
if (need_fix_tab_position)
Expand Down
41 changes: 41 additions & 0 deletions winsup/cygwin/fhandler/pipe.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,16 @@ fhandler_pipe::set_pipe_non_blocking (bool nonblocking)
NTSTATUS status;
IO_STATUS_BLOCK io;
FILE_PIPE_INFORMATION fpi;
bool was_blocking_read_pipe_new = was_blocking_read_pipe;

if (get_device () == FH_PIPER && nonblocking && !was_blocking_read_pipe)
{
status = NtQueryInformationFile (get_handle (), &io, &fpi, sizeof fpi,
FilePipeInformation);
if (NT_SUCCESS (status))
was_blocking_read_pipe_new =
(fpi.CompletionMode == FILE_PIPE_QUEUE_OPERATION);
}

fpi.ReadMode = FILE_PIPE_BYTE_STREAM_MODE;
fpi.CompletionMode = nonblocking ? FILE_PIPE_COMPLETE_OPERATION
Expand All @@ -62,6 +72,11 @@ fhandler_pipe::set_pipe_non_blocking (bool nonblocking)
FilePipeInformation);
if (!NT_SUCCESS (status))
debug_printf ("NtSetInformationFile(FilePipeInformation): %y", status);
else
{
was_blocking_read_pipe = was_blocking_read_pipe_new;
is_blocking_read_pipe = !nonblocking;
}
}

int
Expand Down Expand Up @@ -95,6 +110,8 @@ fhandler_pipe::init (HANDLE f, DWORD a, mode_t mode, int64_t uniq_id)
even with FILE_SYNCHRONOUS_IO_NONALERT. */
set_pipe_non_blocking (get_device () == FH_PIPER ?
true : is_nonblocking ());
was_blocking_read_pipe = false;

return 1;
}

Expand Down Expand Up @@ -289,6 +306,9 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
if (!len)
return;

if (is_blocking_read_pipe)
set_pipe_non_blocking (true);

DWORD timeout = is_nonblocking () ? 0 : INFINITE;
DWORD waitret = cygwait (read_mtx, timeout);
switch (waitret)
Expand Down Expand Up @@ -721,6 +741,8 @@ fhandler_pipe::close ()
CloseHandle (query_hdl);
if (query_hdl_close_req_evt)
CloseHandle (query_hdl_close_req_evt);
if (was_blocking_read_pipe)
set_pipe_non_blocking (false);
int ret = fhandler_base::close ();
ReleaseMutex (hdl_cnt_mtx);
CloseHandle (hdl_cnt_mtx);
Expand Down Expand Up @@ -1377,6 +1399,7 @@ fhandler_pipe::spawn_worker (int fileno_stdin, int fileno_stdout,
{
fhandler_pipe *pipe = (fhandler_pipe *)(fhandler_base *) cfd;
pipe->set_pipe_non_blocking (false);
need_send_noncygchld_sig = true;
}

/* If multiple writers including non-cygwin app exist, the non-cygwin
Expand All @@ -1402,3 +1425,21 @@ fhandler_pipe::spawn_worker (int fileno_stdin, int fileno_stdout,
t->kill_pgrp (__SIGNONCYGCHLD);
}
}

void
fhandler_pipe::sigproc_worker (void)
{
cygheap_fdenum cfd (false);
while (cfd.next () >= 0)
if (cfd->get_dev () == FH_PIPEW)
{
fhandler_pipe *pipe = (fhandler_pipe *)(fhandler_base *) cfd;
if (pipe->need_close_query_hdl ())
pipe->close_query_handle ();
}
else if (cfd->get_dev () == FH_PIPER)
{
fhandler_pipe *pipe = (fhandler_pipe *)(fhandler_base *) cfd;
pipe->is_blocking_read_pipe = true;
}
}
5 changes: 5 additions & 0 deletions winsup/cygwin/local_includes/fhandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -1197,6 +1197,8 @@ class fhandler_pipe: public fhandler_pipe_fifo
private:
HANDLE read_mtx;
pid_t popen_pid;
bool was_blocking_read_pipe;
bool is_blocking_read_pipe;
HANDLE query_hdl;
HANDLE hdl_cnt_mtx;
HANDLE query_hdl_proc;
Expand Down Expand Up @@ -1287,6 +1289,7 @@ class fhandler_pipe: public fhandler_pipe_fifo
}
static void spawn_worker (int fileno_stdin, int fileno_stdout,
int fileno_stderr);
static void sigproc_worker (void);
};

#define CYGWIN_FIFO_PIPE_NAME_LEN 47
Expand Down Expand Up @@ -2160,6 +2163,8 @@ class dev_console
char *cons_rapoi;
bool cursor_key_app_mode;
bool disable_master_thread;
tty::cons_mode curr_input_mode;
tty::cons_mode curr_output_mode;
bool master_thread_suspended;
int num_processed; /* Number of input events in the current input buffer
already processed by cons_master_thread(). */
Expand Down
9 changes: 9 additions & 0 deletions winsup/cygwin/release/3.5.5
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Fixes:
------

- Fix undesired behaviour of console master thread in win32-input-mode
which is supported by Windows Termainal.
Addresses: https://cygwin.com/pipermail/cygwin/2024-August/256380.html

- Fix a regression in 3.5.4 that writing to pipe extremely slows down.
Addresses: https://cygwin.com/pipermail/cygwin/2024-August/256398.html
9 changes: 1 addition & 8 deletions winsup/cygwin/sigproc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1475,14 +1475,7 @@ wait_sig (VOID *)
}
break;
case __SIGNONCYGCHLD:
cygheap_fdenum cfd (false);
while (cfd.next () >= 0)
if (cfd->get_dev () == FH_PIPEW)
{
fhandler_pipe *pipe = (fhandler_pipe *)(fhandler_base *) cfd;
if (pipe->need_close_query_hdl ())
pipe->close_query_handle ();
}
fhandler_pipe::sigproc_worker ();
break;
}
if (clearwait && !have_execed)
Expand Down

0 comments on commit 1e8cf1a

Please sign in to comment.