Re: [PATCH v2] kernel: refactor: shorten has_pending_signals
From: Oleg Nesterov
Date: Thu May 21 2026 - 09:27:55 EST
On 05/20, Andrea Calabrese wrote:
>
> static inline bool has_pending_signals(sigset_t *signal, sigset_t *blocked)
> {
> - unsigned long ready;
> - long i;
> -
> - switch (_NSIG_WORDS) {
> - default:
> - for (i = _NSIG_WORDS, ready = 0; --i >= 0 ;)
> - ready |= signal->sig[i] &~ blocked->sig[i];
> - break;
> -
> - case 4: ready = signal->sig[3] &~ blocked->sig[3];
> - ready |= signal->sig[2] &~ blocked->sig[2];
> - ready |= signal->sig[1] &~ blocked->sig[1];
> - ready |= signal->sig[0] &~ blocked->sig[0];
> - break;
> -
> - case 2: ready = signal->sig[1] &~ blocked->sig[1];
> - ready |= signal->sig[0] &~ blocked->sig[0];
> - break;
> -
> - case 1: ready = signal->sig[0] &~ blocked->sig[0];
> - }
> - return ready != 0;
> + unsigned long ready = 0;
> + for (long i = 0; i < _NSIG_WORDS; i++)
> + ready |= signal->sig[i] & ~blocked->sig[i];
> + return ready != 0;
> }
Note that with your patch the main loop doesn't stop when ready
becomes != 0...
OK, I guess the modern compilers doesn't need this hint even if
_NSIG_WORDS > 1, so
Acked-by: Oleg Nesterov <oleg@xxxxxxxxxx>
But since your patch is just a cleanup, you could do
for (int i = 0; i < _NSIG_WORDS; i++) {
if (signal->sig[i] & ~blocked->sig[i])
return true;
}
return false;
but this is subjective, I won't insist.
Oleg.