[newlib-cygwin] Cygwin: pipes: drop "tiny pipe" handling

Corinna Vinschen corinna@sourceware.org
Tue Sep 14 15:07:09 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=27b24069d16623ac21e858d998bbaf008c3f0924

commit 27b24069d16623ac21e858d998bbaf008c3f0924
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Tue Sep 7 12:56:48 2021 +0200

    Cygwin: pipes: drop "tiny pipe" handling
    
    Given we return 1 already if WriteQuotaAvailable is > 0, the condition
    for tiny pipes is never true.  Fix the comments.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/select.cc | 22 +++++++---------------
 1 file changed, 7 insertions(+), 15 deletions(-)

diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index ac2fd227e..5e338e43f 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -608,10 +608,12 @@ pipe_data_available (int fd, fhandler_base *fh, HANDLE h, bool writing)
     }
   if (writing)
     {
-	/* If there is anything available in the pipe buffer then signal
-	   that.  This means that a pipe could still block since you could
-	   be trying to write more to the pipe than is available in the
-	   buffer but that is the hazard of select().  */
+      /* WriteQuotaAvailable is decremented by the number of bytes requested
+	 by a blocking reader on the other side of the pipe.  Cygwin readers
+	 are serialized and never request a number of bytes equivalent to the
+	 full buffer size.  So WriteQuotaAvailable is 0 only if either the
+	 read buffer on the other side is really full, or if we have non-Cygwin
+	 readers. */
       if (fpli.WriteQuotaAvailable > 0)
 	{
 	  paranoid_printf ("fd %d, %s, write: size %u, avail %u", fd,
@@ -619,17 +621,7 @@ pipe_data_available (int fd, fhandler_base *fh, HANDLE h, bool writing)
 			   fpli.WriteQuotaAvailable);
 	  return 1;
 	}
-      /* If we somehow inherit a tiny pipe (size < PIPE_BUF), then consider
-	 the pipe writable only if it is completely empty, to minimize the
-	 probability that a subsequent write will block.  */
-      if (fpli.OutboundQuota < PIPE_BUF
-	  && fpli.WriteQuotaAvailable == fpli.OutboundQuota)
-	{
-	  select_printf ("fd, %s, write tiny pipe: size %u, avail %u",
-			 fd, fh->get_name (), fpli.OutboundQuota,
-			 fpli.WriteQuotaAvailable);
-	  return 1;
-	}
+      /* TODO: Buffer really full or non-Cygwin reader? */
     }
   else if (fpli.ReadDataAvailable)
     {


More information about the Cygwin-cvs mailing list