From 0f14f41e72d48836a5287d00f05cea236b25be40 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 6 Aug 2017 20:06:19 +0200 Subject: ash: do not set a signal to SIG_DFL if it already is function old new delta setsignal 312 338 +26 Signed-off-by: Denys Vlasenko --- shell/ash.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/shell/ash.c b/shell/ash.c index e80425f5e..e8f3ed26b 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -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; -- cgit v1.2.3