aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2024-09-01 04:31:03 +0900
committerTakashi Yano <takashi.yano@nifty.ne.jp>2024-09-02 20:12:39 +0900
commitf78009cb1ccf84cc343cf2441c76196461d87532 (patch)
tree0a06dbdcfbfb32abf90bf92ef3f3df74dfd2d99c
parent84d77e5918e18170c393407d477140fcf5d3e432 (diff)
downloadnewlib-f78009cb1ccf84cc343cf2441c76196461d87532.zip
newlib-f78009cb1ccf84cc343cf2441c76196461d87532.tar.gz
newlib-f78009cb1ccf84cc343cf2441c76196461d87532.tar.bz2
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 <jjreisert@alum.mit.edu> Reviewed-by: Corinna Vinschen <corinna@vinschen.de> Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
-rw-r--r--winsup/cygwin/fhandler/pipe.cc6
-rw-r--r--winsup/cygwin/release/3.5.53
2 files changed, 7 insertions, 2 deletions
diff --git a/winsup/cygwin/fhandler/pipe.cc b/winsup/cygwin/fhandler/pipe.cc
index 852076c..c686df6 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 a98687c..904119a 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