*: stop using atexit in non-debug build: saves ~260 in bss with musl
"builtin" below is atexit's 32-element global array of functions to call.
function old new delta
top_main 879 889 +10
launch_helper 185 193 +8
powertop_main 1555 1559 +4
sed_main 651 650 -1
slot 4 - -4
call 4 - -4
atexit 23 - -23
kill_helper 31 - -31
__funcs_on_exit 120 - -120
__cxa_atexit 168 - -168
builtin 260 - -260
------------------------------------------------------------------------------
(add/remove: 0/8 grow/shrink: 3/1 up/down: 22/-611) Total: -589 bytes
text data bss dec hex filename
912364 563 6132 919059 e0613 busybox_old
912035 563 5844 918442 e03aa busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/editors/sed.c b/editors/sed.c
index f68f447..3fc40ce 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -1521,7 +1521,7 @@
//argc -= optind;
argv += optind;
if (opt & OPT_in_place) { // -i
- atexit(cleanup_outname);
+ die_func = cleanup_outname;
}
if (opt & (2|4))
G.regex_type |= REG_EXTENDED; // -r or -E
diff --git a/mailutils/mail.c b/mailutils/mail.c
index a7e43c0..eceb890 100644
--- a/mailutils/mail.c
+++ b/mailutils/mail.c
@@ -6,23 +6,15 @@
*
* Licensed under GPLv2, see file LICENSE in this source tree.
*/
+#include <sys/prctl.h>
#include "libbb.h"
#include "mail.h"
-static void kill_helper(void)
-{
- if (G.helper_pid > 0) {
- kill(G.helper_pid, SIGTERM);
- G.helper_pid = 0;
- }
-}
-
// generic signal handler
static void signal_handler(int signo)
{
#define err signo
if (SIGALRM == signo) {
- kill_helper();
bb_error_msg_and_die("timed out");
}
@@ -66,16 +58,15 @@
// child stdout [1] -> parent stdin [0]
if (!G.helper_pid) {
- // child: try to execute connection helper
+ // child
+ // if parent dies, get SIGTERM
+ prctl(PR_SET_PDEATHSIG, SIGTERM, 0, 0, 0);
+ // try to execute connection helper
// NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec
BB_EXECVP_or_die((char**)argv);
}
- // parent
- // check whether child is alive
- //redundant:signal_handler(SIGCHLD);
- // child seems OK -> parent goes on
- atexit(kill_helper);
+ // parent goes on
}
char* FAST_FUNC send_mail_command(const char *fmt, const char *param)
diff --git a/procps/powertop.c b/procps/powertop.c
index ebd659b..5d522bf 100644
--- a/procps/powertop.c
+++ b/procps/powertop.c
@@ -8,11 +8,6 @@
*
* Licensed under GPLv2, see file LICENSE in this source tree.
*/
-
-//applet:IF_POWERTOP(APPLET(powertop, BB_DIR_USR_SBIN, BB_SUID_DROP))
-
-//kbuild:lib-$(CONFIG_POWERTOP) += powertop.o
-
//config:config POWERTOP
//config: bool "powertop (9.1 kb)"
//config: default y
@@ -27,6 +22,10 @@
//config: Without this, powertop will only refresh display every 10 seconds.
//config: No keyboard commands will work, only ^C to terminate.
+//applet:IF_POWERTOP(APPLET(powertop, BB_DIR_USR_SBIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_POWERTOP) += powertop.o
+
// XXX This should be configurable
#define ENABLE_FEATURE_POWERTOP_PROCIRQ 1
@@ -718,7 +717,7 @@
set_termios_to_raw(STDIN_FILENO, &G.init_settings, TERMIOS_CLEAR_ISIG);
bb_signals(BB_FATAL_SIGS, sig_handler);
/* So we don't forget to reset term settings */
- atexit(reset_term);
+ die_func = reset_term;
#endif
/* Collect initial data */
@@ -855,6 +854,9 @@
} /* for (;;) */
bb_putchar('\n');
+#if ENABLE_FEATURE_POWERTOP_INTERACTIVE
+ reset_term();
+#endif
return EXIT_SUCCESS;
}
diff --git a/procps/top.c b/procps/top.c
index b9958af..f97ded5 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -1146,6 +1146,7 @@
else {
/* Turn on unbuffered input; turn off echoing, ^C ^Z etc */
set_termios_to_raw(STDIN_FILENO, &initial_settings, TERMIOS_CLEAR_ISIG);
+ die_func = reset_term;
}
bb_signals(BB_FATAL_SIGS, sig_catcher);