diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-09-01 04:31:03 +0900 |
---|---|---|
committer | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-09-02 20:20:13 +0900 |
commit | 37ab3e0d55e3ff3932509bfd2f2625c138b18866 (patch) | |
tree | 9e0dbef7ad1ac6d5faf9dff697c3d9510fee4183 /winsup | |
parent | 68a14b66ff2dd6e71497a3a9583253d17e7e790e (diff) | |
download | newlib-github/cygwin-3_5-branch.zip newlib-github/cygwin-3_5-branch.tar.gz newlib-github/cygwin-3_5-branch.tar.bz2 |
Cygwin: pipe: Fix a regression that raw_write() slows downgithub/cygwin-3_5-branchcygwin-3_5-branch
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>
(cherry picked from commit f78009cb1ccf84cc343cf2441c76196461d87532)
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/fhandler/pipe.cc | 6 | ||||
-rw-r--r-- | 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 6658a23..9973468 100644 --- a/winsup/cygwin/fhandler/pipe.cc +++ b/winsup/cygwin/fhandler/pipe.cc @@ -503,8 +503,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) @@ -512,6 +513,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 |