From bd72ba3a4b5f9a2a220a420e5182eaeaeeb88e76 Mon Sep 17 00:00:00 2001 From: James Clarke Date: Fri, 13 Oct 2017 17:09:47 +0100 Subject: [PATCH] sig: Move runtime signal count check to compile time Since the value of number_of_signals is known at compile time, we can use a compile-time check instead. This also adds SIGLOST for the Hurd, uses the correct signal counts for the Hurd and FreeBSD, and only gives a compile-time warning when compiled on an unknown platform that it does not know whether the number of signals is correct. --- proc/sig.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/proc/sig.c b/proc/sig.c index a93aabb9..b883185f 100644 --- a/proc/sig.c +++ b/proc/sig.c @@ -34,8 +34,10 @@ * You get SIGSTKFLT and SIGUNUSED instead on i386, m68k, ppc, and arm. * (this is a Linux & libc bug -- both must be fixed) * - * Total garbage: SIGIO SIGINFO SIGIOT SIGLOST SIGCLD + * Total garbage: SIGIO SIGINFO SIGIOT SIGCLD * (popular ones are handled as aliases) + * SIGLOST + * (except on the Hurd; reused to mean a server died) * Nearly garbage: SIGSTKFLT SIGUNUSED (nothing else to fill slots) */ @@ -50,6 +52,10 @@ # undef SIGSTKFLT #endif +#if !defined(__GNU__) && defined(SIGLOST) +# undef SIGLOST +#endif + #ifndef SIGRTMIN # warning Standards require that define SIGRTMIN; assuming 32 # define SIGRTMIN 32 @@ -81,6 +87,9 @@ static const mapstruct sigtable[] = { {"ILL", SIGILL}, {"INT", SIGINT}, {"KILL", SIGKILL}, +#ifdef SIGLOST + {"LOST", SIGLOST}, /* Hurd-specific */ +#endif {"PIPE", SIGPIPE}, {"POLL", SIGPOLL}, /* IO */ {"PROF", SIGPROF}, @@ -108,7 +117,24 @@ static const mapstruct sigtable[] = { {"XFSZ", SIGXFSZ} }; -static const int number_of_signals = sizeof(sigtable)/sizeof(mapstruct); +#define number_of_signals (sizeof(sigtable)/sizeof(mapstruct)) + +#define XJOIN(a, b) JOIN(a, b) +#define JOIN(a, b) a##b +#define STATIC_ASSERT(x) typedef int XJOIN(static_assert_on_line_,__LINE__)[(x) ? 1 : -1] + +/* sanity check */ +#if defined(__linux__) +STATIC_ASSERT(number_of_signals == 31); +#elif defined(__FreeBSD_kernel__) || defined(__FreeBSD__) +STATIC_ASSERT(number_of_signals == 30); +#elif defined(__GNU__) +STATIC_ASSERT(number_of_signals == 31); +#elif defined(__CYGWIN__) +STATIC_ASSERT(number_of_signals == 31); +#else +# warning Unknown operating system; assuming number_of_signals is correct +#endif static int compare_signal_names(const void *a, const void *b){ return strcasecmp( ((const mapstruct*)a)->name, ((const mapstruct*)b)->name ); @@ -285,12 +311,3 @@ void unix_print_signals(void){ } printf("\n"); } - -/* sanity check */ -static int init_signal_list(void) __attribute__((constructor)); -static int init_signal_list(void){ - if(number_of_signals != 31){ - fprintf(stderr, "WARNING: %d signals -- adjust and recompile.\n", number_of_signals); - } - return 0; -}