mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-22 00:38:06 +08:00
Cygwin: signal: Fix high load when retrying to process pending signal
The commit e10f822a2b39 has a problem that CPU load gets high if pending signal is not processed successfully for a long time. With this patch, wait_sig() calls Sleep(1), rather than yield(), if the pending signal has not been processed successfully for a predetermined time to prevent CPU from high load. Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256884.html Fixes: e10f822a2b39 ("Cygwin: signal: Handle queued signal without explicit __SIGFLUSH") Reported-by: 凯夏 <walkerxk@gmail.com> Reviewed-by: Corinna Vinschen <corinna@vinschen.de> Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
This commit is contained in:
parent
06952f41ff
commit
1d1451ccd2
@ -1345,6 +1345,12 @@ wait_sig (VOID *)
|
||||
|
||||
hntdll = GetModuleHandle ("ntdll.dll");
|
||||
|
||||
/* GetTickCount() here is enough because GetTickCount() - t0 does
|
||||
not overflow until 49 days psss. Even if GetTickCount() overflows,
|
||||
GetTickCount() - t0 returns correct value, since underflow in
|
||||
unsigned wraps correctly. Pending a signal for more thtn 49
|
||||
days would be noncense. */
|
||||
DWORD t0 = GetTickCount ();
|
||||
for (;;)
|
||||
{
|
||||
DWORD nb;
|
||||
@ -1354,7 +1360,7 @@ wait_sig (VOID *)
|
||||
else if (sigq.start.next
|
||||
&& PeekNamedPipe (my_readsig, NULL, 0, NULL, &nb, NULL) && !nb)
|
||||
{
|
||||
yield ();
|
||||
Sleep (GetTickCount () - t0 > 10 ? 1 : 0);
|
||||
pack.si.si_signo = __SIGFLUSH;
|
||||
}
|
||||
else if (!ReadFile (my_readsig, &pack, sizeof (pack), &nb, NULL))
|
||||
@ -1364,6 +1370,8 @@ wait_sig (VOID *)
|
||||
system_printf ("garbled signal pipe data nb %u, sig %d", nb, pack.si.si_signo);
|
||||
continue;
|
||||
}
|
||||
if (pack.si.si_signo != __SIGFLUSH)
|
||||
t0 = GetTickCount ();
|
||||
|
||||
sigq.retry = false;
|
||||
/* Don't process signals when we start exiting */
|
||||
|
Loading…
x
Reference in New Issue
Block a user