[newlib-cygwin/main] Cygwin: pipe_data_available: drop special casing select
Corinna Vinschen
corinna@sourceware.org
Tue Feb 25 09:31:57 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=4bcc6adec765ee8354bfc9e6c060c9d1c0c7bf46
commit 4bcc6adec765ee8354bfc9e6c060c9d1c0c7bf46
Author: Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Tue Feb 25 10:29:29 2025 +0100
Commit: Corinna Vinschen <corinna@vinschen.de>
CommitDate: Tue Feb 25 10:29:29 2025 +0100
Cygwin: pipe_data_available: drop special casing select
After 11a84cc757ef ("Cygwin: fix SSH hangs"), select returns
writability if any number of bytes are left in the buffer.
Thus, the reason for pipe_data_available() to return PIPE_BUF
when called from select() is gone, and we can drop special casing
select().
So together with 11a84cc757ef ("Cygwin: fix SSH hangs"), this
patch essentially reverts 555afcb2f3a6 ("Cygwin: select: set pipe
writable only if PIPE_BUF bytes left")
Rather than reverting the flag parameter to a bool, keep a mode
argument set to PDA_READ or PDA_WRITE. If we can't evaluate
the number of bytes left, just return 1 to select(), as for any
other caller.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/local_includes/select.h | 2 +-
winsup/cygwin/select.cc | 29 ++++++++++-------------------
2 files changed, 11 insertions(+), 20 deletions(-)
diff --git a/winsup/cygwin/local_includes/select.h b/winsup/cygwin/local_includes/select.h
index dea023343f7c..43ceb1d7ea9a 100644
--- a/winsup/cygwin/local_includes/select.h
+++ b/winsup/cygwin/local_includes/select.h
@@ -141,7 +141,7 @@ extern "C" int cygwin_select (int , fd_set *, fd_set *, fd_set *,
ssize_t pipe_data_available (int, fhandler_base *, HANDLE, int);
+#define PDA_READ 0x00
#define PDA_WRITE 0x01
-#define PDA_SELECT 0x02
#endif /* _SELECT_H_ */
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index 012578886011..422c8e830b33 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -593,12 +593,12 @@ no_verify (select_record *, fd_set *, fd_set *, fd_set *)
}
ssize_t
-pipe_data_available (int fd, fhandler_base *fh, HANDLE h, int flags)
+pipe_data_available (int fd, fhandler_base *fh, HANDLE h, int mode)
{
if (fh->get_device () == FH_PIPER)
{
DWORD nbytes_in_pipe;
- if (!(flags & PDA_WRITE)
+ if (mode == PDA_READ
&& PeekNamedPipe (h, NULL, 0, NULL, &nbytes_in_pipe, NULL))
return nbytes_in_pipe;
return -1;
@@ -618,17 +618,9 @@ pipe_data_available (int fd, fhandler_base *fh, HANDLE h, int flags)
access on the write end. */
select_printf ("fd %d, %s, NtQueryInformationFile failed, status %y",
fd, fh->get_name (), status);
- switch (flags)
- {
- case PDA_WRITE:
- return 1;
- case PDA_SELECT | PDA_WRITE:
- return PIPE_BUF;
- default:
- return -1;
- }
+ return (mode == PDA_WRITE) ? 1 : -1;
}
- if (flags & PDA_WRITE)
+ if (mode == PDA_WRITE)
{
/* If there is anything available in the pipe buffer then signal
that. This means that a pipe could still block since you could
@@ -665,7 +657,7 @@ pipe_data_available (int fd, fhandler_base *fh, HANDLE h, int flags)
return 0; /* Full */
else if (!NT_SUCCESS (status))
/* We cannot know actual write pipe space. */
- return (flags & PDA_SELECT) ? PIPE_BUF : 1;
+ return 1;
/* Restore pipe mode to blocking mode */
((fhandler_pipe *) fh)->set_pipe_non_blocking (false);
/* Empty */
@@ -732,10 +724,10 @@ peek_pipe (select_record *s, bool from_select)
gotone = s->read_ready = true;
goto out;
}
- ssize_t n = pipe_data_available (s->fd, fh, h, PDA_SELECT);
+ ssize_t n = pipe_data_available (s->fd, fh, h, PDA_READ);
/* On PTY masters, check if input from the echo pipe is available. */
if (n == 0 && fh->get_echo_handle ())
- n = pipe_data_available (s->fd, fh, fh->get_echo_handle (), PDA_SELECT);
+ n = pipe_data_available (s->fd, fh, fh->get_echo_handle (), PDA_READ);
if (n < 0)
{
@@ -776,7 +768,7 @@ out:
gotone += s->except_ready = true;
return gotone;
}
- ssize_t n = pipe_data_available (s->fd, fh, h, PDA_SELECT | PDA_WRITE);
+ ssize_t n = pipe_data_available (s->fd, fh, h, PDA_WRITE);
select_printf ("write: %s, n %d", fh->get_name (), n);
gotone += s->write_ready = (n > 0);
if (n < 0 && s->except_selected)
@@ -989,8 +981,7 @@ peek_fifo (select_record *s, bool from_select)
out:
if (s->write_selected)
{
- ssize_t n = pipe_data_available (s->fd, fh, fh->get_handle (),
- PDA_SELECT | PDA_WRITE);
+ ssize_t n = pipe_data_available (s->fd, fh, fh->get_handle (), PDA_WRITE);
select_printf ("write: %s, n %d", fh->get_name (), n);
gotone += s->write_ready = (n > 0);
if (n < 0 && s->except_selected)
@@ -1416,7 +1407,7 @@ out:
HANDLE h = ptys->get_output_handle ();
if (s->write_selected)
{
- ssize_t n = pipe_data_available (s->fd, fh, h, PDA_SELECT | PDA_WRITE);
+ ssize_t n = pipe_data_available (s->fd, fh, h, PDA_WRITE);
select_printf ("write: %s, n %d", fh->get_name (), n);
gotone += s->write_ready = (n > 0);
if (n < 0 && s->except_selected)
More information about the Cygwin-cvs
mailing list