From: Rich Felker <dalias@libc.org>
To: Joakim Sindholt <opensource@zhasha.com>
Cc: musl@lists.openwall.com
Subject: Re: [musl] [PATCH v2 1/3] src/signal/sys_signame.c: create hidden value-name table of signals
Date: Mon, 5 Aug 2024 11:29:03 -0400 [thread overview]
Message-ID: <20240805152903.GA10433@brightrain.aerifal.cx> (raw)
In-Reply-To: <20240805111313.1880ccf5@eclair>
On Mon, Aug 05, 2024 at 11:13:13AM +0200, Joakim Sindholt wrote:
> On Mon, 5 Aug 2024 08:56:05 +0200
> contact@hacktivis.me wrote:
>
> > From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
> >
> > ---
> > src/include/signal.h | 2 ++
> > src/signal/sys_signame.c | 41 ++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 43 insertions(+)
> > create mode 100644 src/signal/sys_signame.c
> >
> > diff --git a/src/include/signal.h b/src/include/signal.h
> > index bb566784..6bbc51d9 100644
> > --- a/src/include/signal.h
> > +++ b/src/include/signal.h
> > @@ -11,4 +11,6 @@ hidden void __restore_sigs(void *);
> >
> > hidden void __get_handler_set(sigset_t *);
> >
> > +hidden extern const char __sys_signame[SIGSYS+1][sizeof("STKFLT")];
> > +
> > #endif
> > diff --git a/src/signal/sys_signame.c b/src/signal/sys_signame.c
> > new file mode 100644
> > index 00000000..e086572c
> > --- /dev/null
> > +++ b/src/signal/sys_signame.c
> > @@ -0,0 +1,41 @@
> > +#include <signal.h>
> > +
> > +#define SIG(s) [SIG##s] = #s
> > +const char __sys_signame[SIGSYS+1][sizeof("STKFLT")] = {
> > + SIG(HUP),
> > + SIG(INT),
> > + SIG(QUIT),
> > + SIG(ILL),
> > + SIG(TRAP),
> > + SIG(ABRT),
> > + SIG(BUS),
> > + SIG(FPE),
> > + SIG(KILL),
> > + SIG(USR1),
> > + SIG(SEGV),
> > + SIG(USR2),
> > + SIG(PIPE),
> > + SIG(ALRM),
> > + SIG(TERM),
> > +#if defined(SIGSTKFLT)
> > + SIG(STKFLT),
> > +#endif
> > +#if defined(SIGEMT)
> > + SIG(EMT),
> > +#endif
> > + SIG(CHLD),
> > + SIG(CONT),
> > + SIG(STOP),
> > + SIG(TSTP),
> > + SIG(TTIN),
> > + SIG(TTOU),
> > + SIG(URG),
> > + SIG(XCPU),
> > + SIG(XFSZ),
> > + SIG(VTALRM),
> > + SIG(PROF),
> > + SIG(WINCH),
> > + SIG(IO),
> > + SIG(PWR),
> > + SIG(SYS)
> > +};
>
> I know I'm being terribly annoying here but based on Rich's apparent
> preference for saving rodata space we could take out SIGSTKFLT, VTALRM,
> and WINCH. That leaves only 4-char signals with a handful of 3-char, and
> since we need to search through a few aliases and special cases anyway
> we could just add those 3 to a second table.
>
> Also I hope there's a nicer way of making that table but this is what I
> came up with in a hurry.
> #include "signal.h"
> #include <errno.h>
> #include <string.h>
> #include <ctype.h>
>
> #define SIG(s) [SIG##s-1] = #s
>
> static const char map[][4] = {
> SIG(HUP),
> SIG(INT),
> SIG(QUIT),
> SIG(ILL),
> SIG(TRAP),
> SIG(ABRT),
> SIG(BUS),
> SIG(FPE),
> SIG(KILL),
> SIG(USR1),
> SIG(SEGV),
> SIG(USR2),
> SIG(PIPE),
> SIG(ALRM),
> SIG(TERM),
> SIG(CHLD),
> SIG(CONT),
> SIG(STOP),
> SIG(TSTP),
> SIG(TTIN),
> SIG(TTOU),
> SIG(URG),
> SIG(XCPU),
> SIG(XFSZ),
> SIG(PROF),
> SIG(IO),
> SIG(PWR),
> SIG(SYS),
> #ifdef SIGEMT
> SIG(EMT),
> #endif
> };
>
> static const char other[] = {
> #ifdef SIGSTKFLT
> SIGSTKFLT, 'S','T','K','F','L','T', 0,
> #endif
> SIGVTALRM, 'V','T','A','L','R','M', 0,
> SIGWINCH, 'W','I','N','C','H', 0,
> RTMIN, 'R','T','M','I','N', 0,
> RTMAX, 'R','T','M','A','X', 0,
> /* aliases */
> SIGPOLL, 'P','O','L','L', 0,
> SIGIOT, 'I','O','T', 0,
> SIGUNUSED, 'U','N','U','S','E','D', 0,
> 0
> };
>
> int sig2str(int sig, char *str)
> {
> const char *p;
> int i, num;
>
> if (sig > 0 && sig-1 < sizeof map/sizeof *map && *map[sig-1]) {
> for (i = 0; i < sizeof *map; i++)
> str[i] = map[sig-1][i];
> str[i] = 0;
> return 0;
> } else if (sig > RTMIN && sig < RTMAX) {
> for (i = 0; i < 6; i++)
> str[i] = "RTMIN+"[i];
> num = sig-RTMIN;
> if (num > 10)
> str[i++] = '0'+num/10;
> str[i++] = '0'+num%10;
> str[i] = 0;
> return 0;
> } else for (p = other, i = 0; i < 5; i++) {
> if (*p++ == sig) {
> for (i = 0; p[i]; i++)
> str[i] = p[i];
> return 0;
> }
> while (*p++)
> ;
> p++;
> }
> errno = EINVAL;
> return -1;
> }
>
> int str2sig(const char *restrict str, int *restrict sig)
> {
> const char *p;
> size_t len;
> int i, num;
>
> len = strnlen(str, 5);
> if (len == 3 || len == 4)
> for (i = 0; i < sizeof map/sizeof *map; i++)
> if (strncmp(str, map[i], 4) == 0)
> return (*sig = i+1, 0);
> if (len <= 6)
> for (p = other; *p; p += len+1)
> if (strncmp(str, p+1, (len = strnlen(p+1, 6)+1)) == 0)
> return (*sig = *p, 0);
>
> i = strncmp(str, "RTMIN+", 6)==0||strncmp(str, "RTMAX-", 6)==0?6:0;
> if (str[i] >= '1' && str[i] <= '9') {
> num = str[i++]-'0';
> if (isdigit(str[i]))
> num = num*10+str[i++]-'0';
> if (!str[i]) {
> if (isdigit(*str)) {
> if (num <= RTMAX)
> return (*sig = num, 0);
> } else if (num < RTMAX-RTMIN)
> return (*sig = str[5]=='+'?RTMIN+num:RTMAX-num, 0);
> }
> }
> /* errno = EINVAL ? */
> return -1;
> }
I don't see how this helps. You're adding at least 64 bytes of code
(.text) to save 64 bytes of table space...? My comment before was that
the waste from just using a 2D array [][6] is small enough that the
.text to do better would be larger than the .rodata, so it makes sense
to just do it the simplest way.
Rich
prev parent reply other threads:[~2024-08-05 15:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-05 6:56 contact
2024-08-05 6:56 ` [musl] [PATCH v2 2/3] signal: add sig2str(3) from POSIX.1-2024 contact
2024-08-05 18:12 ` Rich Felker
2024-08-05 6:56 ` [musl] [PATCH v2 3/3] signal: add str2sig(3) " contact
2024-08-05 18:26 ` Rich Felker
2024-08-06 8:21 ` Haelwenn (lanodan) Monnier
2024-08-05 9:13 ` [musl] [PATCH v2 1/3] src/signal/sys_signame.c: create hidden value-name table of signals Joakim Sindholt
2024-08-05 15:29 ` Rich Felker [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240805152903.GA10433@brightrain.aerifal.cx \
--to=dalias@libc.org \
--cc=musl@lists.openwall.com \
--cc=opensource@zhasha.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).