Changeset 3409 for trunk/src


Ignore:
Timestamp:
Aug 13, 2020, 11:49:06 AM (5 years ago)
Author:
bird
Message:

kash: Generate the signal names at compile time rather than lazily at runtime. This should be more efficient, though may cause trouble if cross building.

Location:
trunk/src/kash
Files:
5 edited
1 copied
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/Makefile.kmk

    r3110 r3409  
    104104        shfile.c
    105105kash_SOURCES.gnuhurd = \
    106         sys_signame.c \
     106        $(kash_0_OUTDIR)/sys_signame.c \
    107107        strlcpy.c
    108108kash_SOURCES.gnukfbsd = \
    109         sys_signame.c \
     109        $(kash_0_OUTDIR)/sys_signame.c \
    110110        strlcpy.c
    111111kash_SOURCES.gnuknbsd = \
    112         sys_signame.c \
     112        $(kash_0_OUTDIR)/sys_signame.c \
    113113        strlcpy.c
    114114kash_SOURCES.haiku = \
    115         sys_signame.c \
     115        $(kash_0_OUTDIR)/sys_signame.c \
    116116        strlcpy.c
    117117kash_SOURCES.linux = \
    118         sys_signame.c \
     118        $(kash_0_OUTDIR)/sys_signame.c \
    119119        strlcpy.c
    120120kash_SOURCES.solaris = \
    121         sys_signame.c \
     121        $(kash_0_OUTDIR)/sys_signame.c \
    122122        strlcpy.c
    123123kash_SOURCES.win = \
    124         sys_signame.c \
     124        $(kash_0_OUTDIR)/sys_signame.c \
     125        strsignal.c \
    125126        strlcpy.c \
    126127        shfork-win.c \
     
    145146#kash.man_TEMPLATE = usr.bin.man
    146147#kash.man_SOURCES = sh.1=>kash.1
     148
     149
     150#
     151# The signal name list:
     152#
     153$$(kash_0_OUTDIR)/sys_signame.c: $$(bld_signames_1_TARGET) | $$(dir $$@)
     154        $< $@
     155
     156BLDPROGS += bld_signames
     157bld_signames_TEMPLATE := BLD
     158bld_signames_DEFS     := SHELL SMALL
     159bld_signames_SOURCES  := bld_signames.c
    147160
    148161
  • trunk/src/kash/bld_signames.c

    r3408 r3409  
    1 /*
    2  * Fake sys_signame.
    3  */
    41
    52#include "shinstance.h" /* for MSC */
     
    74#include <stdio.h>
    85
    9 static char sys_signame_initialized = 0;
    10 char sys_signame[NSIG][16];
     6int main(int argc, char **argv)
     7{
     8    char    aszSigName[NSIG][16];
     9    FILE   *pFile;
     10    int     i;
    1111
    12 void init_sys_signame(void)
    13 {
    14         unsigned i;
    15         if (sys_signame_initialized)
    16                 return;
    17         for (i = 0; i < NSIG; ++i)
    18                 sprintf(sys_signame[i], "%d", i);
    19 #define SET_SIG_STR(sig) strcpy(sys_signame[SIG##sig], #sig);
     12    if (argc != 2 || *argv[1] == '\0')
     13    {
     14        fprintf(stderr, "syntax error: Expected exactly one parameter, the output-file!\n");
     15        return 2;
     16    }
     17
     18    /*
     19     * Populate the name array.
     20     */
     21    strcpy(aszSigName[0], "Signal 0");
     22    for (i = 1; i < NSIG; ++i)
     23        sprintf(aszSigName[i], "%i", i);
     24
     25#define SET_SIG_STR(sig) strcpy(aszSigName[SIG##sig], #sig);
    2026#ifdef SIGHUP
    21         SET_SIG_STR(HUP);
     27    SET_SIG_STR(HUP);
    2228#endif
    2329#ifdef SIGINT
    24         SET_SIG_STR(INT);
     30    SET_SIG_STR(INT);
    2531#endif
    2632#ifdef SIGQUIT
    27         SET_SIG_STR(QUIT);
     33    SET_SIG_STR(QUIT);
    2834#endif
    2935#ifdef SIGILL
    30         SET_SIG_STR(ILL);
     36    SET_SIG_STR(ILL);
    3137#endif
    3238#ifdef SIGTRAP
    33         SET_SIG_STR(TRAP);
     39    SET_SIG_STR(TRAP);
    3440#endif
    3541#ifdef SIGABRT
    36         SET_SIG_STR(ABRT);
     42    SET_SIG_STR(ABRT);
    3743#endif
    3844#ifdef SIGIOT
    39         SET_SIG_STR(IOT);
     45    SET_SIG_STR(IOT);
    4046#endif
    4147#ifdef SIGBUS
    42         SET_SIG_STR(BUS);
     48    SET_SIG_STR(BUS);
    4349#endif
    4450#ifdef SIGFPE
    45         SET_SIG_STR(FPE);
     51    SET_SIG_STR(FPE);
    4652#endif
    4753#ifdef SIGKILL
    48         SET_SIG_STR(KILL);
     54    SET_SIG_STR(KILL);
    4955#endif
    5056#ifdef SIGUSR1
    51         SET_SIG_STR(USR1);
     57    SET_SIG_STR(USR1);
    5258#endif
    5359#ifdef SIGSEGV
    54         SET_SIG_STR(SEGV);
     60    SET_SIG_STR(SEGV);
    5561#endif
    5662#ifdef SIGUSR2
    57         SET_SIG_STR(USR2);
     63    SET_SIG_STR(USR2);
    5864#endif
    5965#ifdef SIGPIPE
    60         SET_SIG_STR(PIPE);
     66    SET_SIG_STR(PIPE);
    6167#endif
    6268#ifdef SIGALRM
    63         SET_SIG_STR(ALRM);
     69    SET_SIG_STR(ALRM);
    6470#endif
    6571#ifdef SIGTERM
    66         SET_SIG_STR(TERM);
     72    SET_SIG_STR(TERM);
    6773#endif
    6874#ifdef SIGSTKFLT
    69         SET_SIG_STR(STKFLT);
     75    SET_SIG_STR(STKFLT);
    7076#endif
    7177#ifdef SIGCHLD
    72         SET_SIG_STR(CHLD);
     78    SET_SIG_STR(CHLD);
    7379#endif
    7480#ifdef SIGCONT
    75         SET_SIG_STR(CONT);
     81    SET_SIG_STR(CONT);
    7682#endif
    7783#ifdef SIGSTOP
    78         SET_SIG_STR(STOP);
     84    SET_SIG_STR(STOP);
    7985#endif
    8086#ifdef SIGTSTP
    81         SET_SIG_STR(TSTP);
     87    SET_SIG_STR(TSTP);
    8288#endif
    8389#ifdef SIGTTIN
    84         SET_SIG_STR(TTIN);
     90    SET_SIG_STR(TTIN);
    8591#endif
    8692#ifdef SIGTTOU
    87         SET_SIG_STR(TTOU);
     93    SET_SIG_STR(TTOU);
    8894#endif
    8995#ifdef SIGURG
    90         SET_SIG_STR(URG);
     96    SET_SIG_STR(URG);
    9197#endif
    9298#ifdef SIGXCPU
    93         SET_SIG_STR(XCPU);
     99    SET_SIG_STR(XCPU);
    94100#endif
    95101#ifdef SIGXFSZ
    96         SET_SIG_STR(XFSZ);
     102    SET_SIG_STR(XFSZ);
    97103#endif
    98104#ifdef SIGVTALRM
    99         SET_SIG_STR(VTALRM);
     105    SET_SIG_STR(VTALRM);
    100106#endif
    101107#ifdef SIGPROF
    102         SET_SIG_STR(PROF);
     108    SET_SIG_STR(PROF);
    103109#endif
    104110#ifdef SIGWINCH
    105         SET_SIG_STR(WINCH);
     111    SET_SIG_STR(WINCH);
    106112#endif
    107113#ifdef SIGIO
    108         SET_SIG_STR(IO);
     114    SET_SIG_STR(IO);
    109115#endif
    110116#ifdef SIGPWR
    111         SET_SIG_STR(PWR);
     117    SET_SIG_STR(PWR);
    112118#endif
    113119#ifdef SIGSYS
    114         SET_SIG_STR(SYS);
     120    SET_SIG_STR(SYS);
    115121#endif
    116122#ifdef SIGBREAK
    117         SET_SIG_STR(BREAK);
     123    SET_SIG_STR(BREAK);
    118124#endif
    119125#undef SET_SIG_STR
    120         sys_signame_initialized = 1;
     126
     127    /*
     128     * Write out the list.
     129     */
     130    pFile = fopen(argv[1], "w");
     131    if (!pFile)
     132    {
     133        fprintf(stderr, "error: failed to open '%s' for writing\n", argv[1]);
     134        return 1;
     135    }
     136    fputs("/* autogenerate */\n"
     137          "\n"
     138          "#include \"shinstance.h\"\n"
     139          "\n"
     140          "const char * const sys_signame[NSIG] = \n"
     141          "{\n"
     142          , pFile);
     143    for (i = 0; i < NSIG; i++)
     144        fprintf(pFile, "    \"%s\",\n", aszSigName[i]);
     145    fputs("};\n", pFile);
     146
     147    if (fclose(pFile) != 0)
     148    {
     149        fprintf(stderr, "error: error writing/closing '%s' after writing it\n", argv[1]);
     150        return 1;
     151    }
     152    return 0;
    121153}
    122154
    123 #if defined(_MSC_VER)
    124 const char *strsignal(int iSig)
    125 {
    126     if (!sys_signame_initialized)
    127         init_sys_signame();
    128     if (iSig < NSIG)
    129         return sys_signame(iSig);
    130     return NULL;
    131 }
    132 #endif
    133 
  • trunk/src/kash/bltin/kill.c

    r2312 r3409  
    5252#include "shinstance.h"
    5353
    54 #ifndef HAVE_SYS_SIGNAME
    55 extern void init_sys_signame(void);
    56 extern char sys_signame[NSIG][16];
    57 #endif
    5854
    5955static int nosig(shinstance *, char *);
     
    7268
    7369        numsig = SIGTERM;
    74 #ifndef HAVE_SYS_SIGNAME
    75         init_sys_signame();
    76 #endif
    7770
    7871        argc--, argv++;
  • trunk/src/kash/shinstance.c

    r2809 r3409  
    4343# include <Windows.h>
    4444extern pid_t shfork_do(shinstance *psh); /* shforkA-win.asm */
    45 #endif
    46 #if !defined(HAVE_SYS_SIGNAME) && defined(DEBUG)
    47 extern void init_sys_signame(void);
    4845#endif
    4946
     
    591588        g_sig_state[signo].sa.sa_flags = psh->sigactions[signo].sh_flags & SA_RESTART;
    592589
    593 #if !defined(HAVE_SYS_SIGNAME) && defined(DEBUG)
    594         init_sys_signame();
    595 #endif
    596590        TRACE2((psh, "sh_sigaction: setting signo=%d:%s to {.sa_handler=%p, .sa_flags=%#x}\n",
    597591                signo, sys_signame[signo], g_sig_state[signo].sa.sa_handler, g_sig_state[signo].sa.sa_flags));
  • trunk/src/kash/shinstance.h

    r3408 r3409  
    384384#endif /* _MSC_VER */
    385385#ifndef HAVE_SYS_SIGNAME
    386 extern char sys_signame[NSIG][16];
     386extern const char * const sys_signame[NSIG];
    387387#endif
    388388
  • trunk/src/kash/strsignal.c

    r3408 r3409  
    11/*
    2  * Fake sys_signame.
     2 * Fake strsignal (for Windows/MSC).
    33 */
    44
    55#include "shinstance.h" /* for MSC */
    66#include <string.h>
    7 #include <stdio.h>
    87
    9 static char sys_signame_initialized = 0;
    10 char sys_signame[NSIG][16];
    11 
    12 void init_sys_signame(void)
    13 {
    14         unsigned i;
    15         if (sys_signame_initialized)
    16                 return;
    17         for (i = 0; i < NSIG; ++i)
    18                 sprintf(sys_signame[i], "%d", i);
    19 #define SET_SIG_STR(sig) strcpy(sys_signame[SIG##sig], #sig);
    20 #ifdef SIGHUP
    21         SET_SIG_STR(HUP);
    22 #endif
    23 #ifdef SIGINT
    24         SET_SIG_STR(INT);
    25 #endif
    26 #ifdef SIGQUIT
    27         SET_SIG_STR(QUIT);
    28 #endif
    29 #ifdef SIGILL
    30         SET_SIG_STR(ILL);
    31 #endif
    32 #ifdef SIGTRAP
    33         SET_SIG_STR(TRAP);
    34 #endif
    35 #ifdef SIGABRT
    36         SET_SIG_STR(ABRT);
    37 #endif
    38 #ifdef SIGIOT
    39         SET_SIG_STR(IOT);
    40 #endif
    41 #ifdef SIGBUS
    42         SET_SIG_STR(BUS);
    43 #endif
    44 #ifdef SIGFPE
    45         SET_SIG_STR(FPE);
    46 #endif
    47 #ifdef SIGKILL
    48         SET_SIG_STR(KILL);
    49 #endif
    50 #ifdef SIGUSR1
    51         SET_SIG_STR(USR1);
    52 #endif
    53 #ifdef SIGSEGV
    54         SET_SIG_STR(SEGV);
    55 #endif
    56 #ifdef SIGUSR2
    57         SET_SIG_STR(USR2);
    58 #endif
    59 #ifdef SIGPIPE
    60         SET_SIG_STR(PIPE);
    61 #endif
    62 #ifdef SIGALRM
    63         SET_SIG_STR(ALRM);
    64 #endif
    65 #ifdef SIGTERM
    66         SET_SIG_STR(TERM);
    67 #endif
    68 #ifdef SIGSTKFLT
    69         SET_SIG_STR(STKFLT);
    70 #endif
    71 #ifdef SIGCHLD
    72         SET_SIG_STR(CHLD);
    73 #endif
    74 #ifdef SIGCONT
    75         SET_SIG_STR(CONT);
    76 #endif
    77 #ifdef SIGSTOP
    78         SET_SIG_STR(STOP);
    79 #endif
    80 #ifdef SIGTSTP
    81         SET_SIG_STR(TSTP);
    82 #endif
    83 #ifdef SIGTTIN
    84         SET_SIG_STR(TTIN);
    85 #endif
    86 #ifdef SIGTTOU
    87         SET_SIG_STR(TTOU);
    88 #endif
    89 #ifdef SIGURG
    90         SET_SIG_STR(URG);
    91 #endif
    92 #ifdef SIGXCPU
    93         SET_SIG_STR(XCPU);
    94 #endif
    95 #ifdef SIGXFSZ
    96         SET_SIG_STR(XFSZ);
    97 #endif
    98 #ifdef SIGVTALRM
    99         SET_SIG_STR(VTALRM);
    100 #endif
    101 #ifdef SIGPROF
    102         SET_SIG_STR(PROF);
    103 #endif
    104 #ifdef SIGWINCH
    105         SET_SIG_STR(WINCH);
    106 #endif
    107 #ifdef SIGIO
    108         SET_SIG_STR(IO);
    109 #endif
    110 #ifdef SIGPWR
    111         SET_SIG_STR(PWR);
    112 #endif
    113 #ifdef SIGSYS
    114         SET_SIG_STR(SYS);
    115 #endif
    116 #ifdef SIGBREAK
    117         SET_SIG_STR(BREAK);
    118 #endif
    119 #undef SET_SIG_STR
    120         sys_signame_initialized = 1;
    121 }
    122 
    123 #if defined(_MSC_VER)
    1248const char *strsignal(int iSig)
    1259{
    126     if (!sys_signame_initialized)
    127         init_sys_signame();
    12810    if (iSig < NSIG)
    12911        return sys_signame(iSig);
    13012    return NULL;
    13113}
    132 #endif
    13314
  • trunk/src/kash/trap.c

    r2298 r3409  
    5959#include "shinstance.h"
    6060
    61 #ifndef HAVE_SYS_SIGNAME
    62 extern void init_sys_signame(void);
    63 extern char sys_signame[NSIG][16];
    64 #endif
    6561
    6662/*
     
    10399                p += 3;
    104100
    105 #ifndef HAVE_SYS_SIGNAME
    106         init_sys_signame();
    107 #endif
    108101        for (i = 0; i < NSIG; ++i)
    109102                if (strcasecmp(p, sys_signame[i]) == 0)
     
    121114
    122115        out1str(psh, "EXIT ");
    123 #ifndef HAVE_SYS_SIGNAME
    124         init_sys_signame();
    125 #endif
    126116
    127117        for (n = 1; n < NSIG; n++) {
     
    144134        char **ap;
    145135        int signo;
    146 #ifndef HAVE_SYS_SIGNAME
    147         init_sys_signame();
    148 #endif
    149136
    150137        if (argc <= 1) {
Note: See TracChangeset for help on using the changeset viewer.