mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-02 04:20:28 +08:00
Cygwin: pipe: Fix performance degradation for non-cygwin pipe.
https://cygwin.com/pipermail/cygwin/2022-December/252628.html After the commit 9e4d308cd592, the performance of read from non-cygwin pipe has been degraded. This is because select_sem mechanism does not work for non-cygwin pipe. This patch fixes the issue. Fixes: 9e4d308cd592 ("Cygwin: pipe: Adopt FILE_SYNCHRONOUS_IO_NONALERT flag for read pipe.") Reported-by: tryandbuy <tryandbuy@proton.me> Reviewed-by: Corinna Vinschen <corinna@vinschen.de> Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
This commit is contained in:
parent
55873f0d24
commit
540e5448fc
@ -281,6 +281,8 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
|
|||||||
size_t nbytes = 0;
|
size_t nbytes = 0;
|
||||||
NTSTATUS status = STATUS_SUCCESS;
|
NTSTATUS status = STATUS_SUCCESS;
|
||||||
IO_STATUS_BLOCK io;
|
IO_STATUS_BLOCK io;
|
||||||
|
ULONGLONG t0 = GetTickCount64 (); /* Init timer */
|
||||||
|
const ULONGLONG t0_threshold = 20;
|
||||||
|
|
||||||
if (!len)
|
if (!len)
|
||||||
return;
|
return;
|
||||||
@ -312,6 +314,7 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
|
|||||||
{
|
{
|
||||||
ULONG_PTR nbytes_now = 0;
|
ULONG_PTR nbytes_now = 0;
|
||||||
ULONG len1 = (ULONG) (len - nbytes);
|
ULONG len1 = (ULONG) (len - nbytes);
|
||||||
|
DWORD select_sem_timeout = 0;
|
||||||
|
|
||||||
FILE_PIPE_LOCAL_INFORMATION fpli;
|
FILE_PIPE_LOCAL_INFORMATION fpli;
|
||||||
status = NtQueryInformationFile (get_handle (), &io,
|
status = NtQueryInformationFile (get_handle (), &io,
|
||||||
@ -358,7 +361,18 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
|
|||||||
nbytes = (size_t) -1;
|
nbytes = (size_t) -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
waitret = cygwait (select_sem, 1);
|
/* If the pipe is a non-cygwin pipe, select_sem trick
|
||||||
|
does not work. As a result, the following cygwait()
|
||||||
|
will return only after timeout occurs. This causes
|
||||||
|
performance degradation. However, setting timeout
|
||||||
|
to zero causes high CPU load. So, set timeout to
|
||||||
|
non-zero only when select_sem is valid or pipe is
|
||||||
|
not ready to read for more than t0_threshold.
|
||||||
|
This prevents both the performance degradation and
|
||||||
|
the high CPU load. */
|
||||||
|
if (select_sem || GetTickCount64 () - t0 > t0_threshold)
|
||||||
|
select_sem_timeout = 1;
|
||||||
|
waitret = cygwait (select_sem, select_sem_timeout);
|
||||||
if (waitret == WAIT_CANCELED)
|
if (waitret == WAIT_CANCELED)
|
||||||
pthread::static_cancel_self ();
|
pthread::static_cancel_self ();
|
||||||
else if (waitret == WAIT_SIGNALED)
|
else if (waitret == WAIT_SIGNALED)
|
||||||
|
@ -10,3 +10,6 @@ Bug Fixes
|
|||||||
compiled under Cygwin 3.4.0 having a public facing interface using
|
compiled under Cygwin 3.4.0 having a public facing interface using
|
||||||
FILE need to be recompiled.
|
FILE need to be recompiled.
|
||||||
Addresses: https://savannah.gnu.org/bugs/index.php?63480
|
Addresses: https://savannah.gnu.org/bugs/index.php?63480
|
||||||
|
|
||||||
|
- Fix performance degradation of non-cygwin pipe.
|
||||||
|
Addresses: https://cygwin.com/pipermail/cygwin/2022-December/252628.html
|
||||||
|
Loading…
x
Reference in New Issue
Block a user