optimize sigisemptyset
authorRich Felker <dalias@aerifal.cx>
Tue, 1 May 2018 20:56:02 +0000 (16:56 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 1 May 2018 21:00:31 +0000 (17:00 -0400)
the static const zero set ended up getting put in bss instead of
rodata, wasting writable memory, and the call to memcmp was
size-inefficient. generally for nonstandard extension functions we try
to avoid poking at any internals directly, but the way the zero set
was setup was arguably already doing so.

src/signal/sigisemptyset.c

index 312c66cf84f14362cb29bec7dd3111624993df92..68b8662468eedf54e1e5c7f8695ab78fe7cd2b0e 100644 (file)
@@ -4,6 +4,7 @@
 
 int sigisemptyset(const sigset_t *set)
 {
-       static const unsigned long zeroset[_NSIG/8/sizeof(long)];
-       return !memcmp(set, &zeroset, _NSIG/8);
+       for (size_t i=0; i<_NSIG/8/sizeof *set->__bits; i++)
+               if (set->__bits[i]) return 0;
+       return 1;
 }