ash: do not set a signal to SIG_DFL if it already is
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Aug 2017 18:06:19 +0000 (20:06 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Aug 2017 18:06:19 +0000 (20:06 +0200)
function                                             old     new   delta
setsignal                                            312     338     +26

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index e80425f5ee2d1fba468b5c344020f99905f8bd8f..e8f3ed26be7535ea90be37993bcd90fb781c7ff8 100644 (file)
@@ -366,7 +366,7 @@ struct globals_misc {
 #define S_DFL      1            /* default signal handling (SIG_DFL) */
 #define S_CATCH    2            /* signal is caught */
 #define S_IGN      3            /* signal is ignored (SIG_IGN) */
-#define S_HARD_IGN 4            /* signal is ignored permanently */
+#define S_HARD_IGN 4            /* signal is ignored permanently (it was SIG_IGN on entry to shell) */
 
        /* indicates specified signal received */
        uint8_t gotsig[NSIG - 1]; /* offset by 1: "signal" 0 is meaningless */
@@ -3566,6 +3566,12 @@ setsignal(int signo)
                                cur_act = S_IGN;   /* don't hard ignore these */
                        }
                }
+               if (act.sa_handler == SIG_DFL && new_act == S_DFL) {
+                       /* installing SIG_DFL over SIG_DFL is a no-op */
+                       /* saves one sigaction call in each "sh -c SCRIPT" invocation */
+                       *t = S_DFL;
+                       return;
+               }
        }
        if (cur_act == S_HARD_IGN || cur_act == new_act)
                return;