diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-12-12 15:03:39 +0900 |
---|---|---|
committer | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-12-12 21:38:20 +0900 |
commit | 1d1451ccd2a6c0f0146ddee68f386061b69863c0 (patch) | |
tree | f24a8a4a8c68343cc2963e0b871da2ea4ad8234a | |
parent | 06952f41ff4897c615fa838c5daf571aacb55d0f (diff) | |
download | newlib-1d1451ccd2a6c0f0146ddee68f386061b69863c0.zip newlib-1d1451ccd2a6c0f0146ddee68f386061b69863c0.tar.gz newlib-1d1451ccd2a6c0f0146ddee68f386061b69863c0.tar.bz2 |
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>
-rw-r--r-- | winsup/cygwin/sigproc.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 59b4208..861a8c6 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -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 */ |