Make all signal handler functions async-signal-safe
authorschwarze <schwarze@openbsd.org>
Thu, 2 Sep 2021 11:19:02 +0000 (11:19 +0000)
committerschwarze <schwarze@openbsd.org>
Thu, 2 Sep 2021 11:19:02 +0000 (11:19 +0000)
by deleting the redundant "killersig" struct member
and using the existing sig_atomic_t cl_sigterm variable instead.
While here, garbage collect the h_hup() signal handler
which is essentially identical to h_term().
This also gets rid of the last #define & #undef in cl_main.c.

OK martijn@, and also tested by Tim <trondd at kagu hyphen tsuchi dot com>.

usr.bin/vi/cl/cl.h
usr.bin/vi/cl/cl_funcs.c
usr.bin/vi/cl/cl_main.c
usr.bin/vi/cl/cl_read.c

index bfef0dc..8613313 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cl.h,v 1.11 2021/09/01 14:28:15 schwarze Exp $        */
+/*     $OpenBSD: cl.h,v 1.12 2021/09/02 11:19:02 schwarze Exp $        */
 
 /*-
  * Copyright (c) 1993, 1994
@@ -11,7 +11,6 @@
  *     @(#)cl.h        10.19 (Berkeley) 9/24/96
  */
 
-extern volatile sig_atomic_t cl_sighup;
 extern volatile sig_atomic_t cl_sigint;
 extern volatile sig_atomic_t cl_sigterm;
 extern volatile sig_atomic_t cl_sigwinch;
@@ -31,7 +30,6 @@ typedef struct _cl_private {
        char    *rmso, *smso;   /* Inverse video terminal strings. */
        char    *smcup, *rmcup; /* Terminal start/stop strings. */
 
-       int      killersig;     /* Killer signal. */
 #define        INDX_HUP        0
 #define        INDX_INT        1
 #define        INDX_TERM       2
index eeb6046..24b18c6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cl_funcs.c,v 1.21 2021/09/01 14:28:15 schwarze Exp $  */
+/*     $OpenBSD: cl_funcs.c,v 1.22 2021/09/02 11:19:02 schwarze Exp $  */
 
 /*-
  * Copyright (c) 1993, 1994
@@ -437,7 +437,7 @@ cl_refresh(SCR *sp, int repaint)
         * If we received a killer signal, we're done, there's no point
         * in refreshing the screen.
         */
-       if (clp->killersig)
+       if (cl_sigterm)
                return (0);
 
        /*
@@ -582,7 +582,7 @@ cl_suspend(SCR *sp, int *allowedp)
         * unchanged.  In addition, the terminal has already been reset
         * correctly, so leave it alone.
         */
-       if (clp->killersig) {
+       if (cl_sigterm) {
                F_CLR(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT);
                return (0);
        }
index 4cd624e..5c38139 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cl_main.c,v 1.34 2021/09/01 14:28:15 schwarze Exp $   */
+/*     $OpenBSD: cl_main.c,v 1.35 2021/09/02 11:19:02 schwarze Exp $   */
 
 /*-
  * Copyright (c) 1993, 1994
@@ -33,7 +33,6 @@
 
 GS *__global_list;                             /* GLOBAL: List of screens. */
 
-volatile sig_atomic_t cl_sighup;
 volatile sig_atomic_t cl_sigint;
 volatile sig_atomic_t cl_sigterm;
 volatile sig_atomic_t cl_sigwinch;
@@ -120,9 +119,9 @@ main(int argc, char *argv[])
        }
 
        /* If a killer signal arrived, pretend we just got it. */
-       if (clp->killersig) {
-               (void)signal(clp->killersig, SIG_DFL);
-               (void)kill(getpid(), clp->killersig);
+       if (cl_sigterm) {
+               (void)signal(cl_sigterm, SIG_DFL);
+               (void)kill(getpid(), cl_sigterm);
                /* NOTREACHED */
        }
 
@@ -215,17 +214,6 @@ term_init(char *ttype)
        }
 }
 
-#define        GLOBAL_CLP \
-       CL_PRIVATE *clp = GCLP(__global_list);
-static void
-h_hup(int signo)
-{
-       GLOBAL_CLP;
-
-       cl_sighup = 1;
-       clp->killersig = SIGHUP;
-}
-
 static void
 h_int(int signo)
 {
@@ -235,10 +223,7 @@ h_int(int signo)
 static void
 h_term(int signo)
 {
-       GLOBAL_CLP;
-
-       cl_sigterm = 1;
-       clp->killersig = SIGTERM;
+       cl_sigterm = signo;
 }
 
 static void
@@ -246,7 +231,6 @@ h_winch(int signo)
 {
        cl_sigwinch = 1;
 }
-#undef GLOBAL_CLP
 
 /*
  * sig_init --
@@ -261,20 +245,19 @@ sig_init(GS *gp, SCR *sp)
 
        clp = GCLP(gp);
 
-       cl_sighup = 0;
        cl_sigint = 0;
        cl_sigterm = 0;
        cl_sigwinch = 0;
 
        if (sp == NULL) {
-               if (setsig(SIGHUP, &clp->oact[INDX_HUP], h_hup) ||
+               if (setsig(SIGHUP, &clp->oact[INDX_HUP], h_term) ||
                    setsig(SIGINT, &clp->oact[INDX_INT], h_int) ||
                    setsig(SIGTERM, &clp->oact[INDX_TERM], h_term) ||
                    setsig(SIGWINCH, &clp->oact[INDX_WINCH], h_winch)
                    )
                        err(1, NULL);
        } else
-               if (setsig(SIGHUP, NULL, h_hup) ||
+               if (setsig(SIGHUP, NULL, h_term) ||
                    setsig(SIGINT, NULL, h_int) ||
                    setsig(SIGTERM, NULL, h_term) ||
                    setsig(SIGWINCH, NULL, h_winch)
index aa3e1ba..0e4166a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cl_read.c,v 1.22 2021/09/01 14:28:15 schwarze Exp $   */
+/*     $OpenBSD: cl_read.c,v 1.23 2021/09/02 11:19:02 schwarze Exp $   */
 
 /*-
  * Copyright (c) 1993, 1994
@@ -62,13 +62,15 @@ retest:     if (LF_ISSET(EC_INTERRUPT) || cl_sigint) {
                        evp->e_event = E_TIMEOUT;
                return (0);
        }
-       if (cl_sighup) {
+       switch (cl_sigterm) {
+       case SIGHUP:
                evp->e_event = E_SIGHUP;
                return (0);
-       }
-       if (cl_sigterm) {
+       case SIGTERM:
                evp->e_event = E_SIGTERM;
                return (0);
+       default:
+               break;
        }
        if (cl_sigwinch) {
                cl_sigwinch = 0;