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

commit f78009cb1ccf84cc343cf2441c76196461d87532
Author: Takashi Yano <[email protected]>
Date:   Sun Sep 1 04:31:03 2024 +0900

    Cygwin: pipe: Fix a regression that raw_write() slows down
    
    After the commit 7f3c22532577, writing to pipe extremely slows down.
    This is because cygwait(select_sem, 10, cw_cancel) is called even
    when write operation is already completed. With this patch, the
    cygwait() is called only if the write operation is not completed.
    
    Addresses: https://cygwin.com/pipermail/cygwin/2024-August/256398.html
    Fixes: 7f3c22532577 ("Cygwin: pipe: handle signals explicitely in 
raw_write")
    Reported-by: Jim Reisert AD1C <[email protected]>
    Reviewed-by: Corinna Vinschen <[email protected]>
    Signed-off-by: Takashi Yano <[email protected]>

Diff:
---
 winsup/cygwin/fhandler/pipe.cc | 6 ++++--
 winsup/cygwin/release/3.5.5    | 3 +++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/fhandler/pipe.cc b/winsup/cygwin/fhandler/pipe.cc
index 852076ccc..c686df650 100644
--- a/winsup/cygwin/fhandler/pipe.cc
+++ b/winsup/cygwin/fhandler/pipe.cc
@@ -518,8 +518,9 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len)
                      raise (SIGPIPE);
                      goto out;
                    }
-                 else
-                   cygwait (select_sem, 10, cw_cancel);
+                 /* Break out on completion */
+                 if (waitret == WAIT_OBJECT_0)
+                   break;
                  /* If we got a timeout in the blocking case, and we already
                     did a short write, we got a signal in the previous loop. */
                  if (waitret == WAIT_TIMEOUT && short_write_once)
@@ -527,6 +528,7 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len)
                      waitret = WAIT_SIGNALED;
                      break;
                    }
+                 cygwait (select_sem, 10, cw_cancel);
                }
              /* Loop in case of blocking write or SA_RESTART */
              while (waitret == WAIT_TIMEOUT || waitret == WAIT_SIGNALED);
diff --git a/winsup/cygwin/release/3.5.5 b/winsup/cygwin/release/3.5.5
index a98687c26..904119a38 100644
--- a/winsup/cygwin/release/3.5.5
+++ b/winsup/cygwin/release/3.5.5
@@ -4,3 +4,6 @@ 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

Reply via email to