From e440b39416e7876129e619f7aa6935c783020645 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 16 Aug 2017 17:45:32 +0200 Subject: *: 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 --- editors/sed.c | 2 +- mailutils/mail.c | 21 ++++++--------------- procps/powertop.c | 14 ++++++++------ procps/top.c | 1 + 4 files changed, 16 insertions(+), 22 deletions(-) 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 @@ int sed_main(int argc UNUSED_PARAM, char **argv) //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 #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 @@ void FAST_FUNC launch_helper(const char **argv) // 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 @@ int powertop_main(int UNUSED_PARAM argc, char UNUSED_PARAM **argv) 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 @@ int powertop_main(int UNUSED_PARAM argc, char UNUSED_PARAM **argv) } /* 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 @@ int top_main(int argc UNUSED_PARAM, char **argv) 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); -- cgit v1.1