From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-3.7 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, RP_MATCHES_RCVD shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: spew@80x24.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id D87371FA50; Sat, 25 Oct 2014 08:30:28 +0000 (UTC) From: Eric Wong To: spew@80x24.org Cc: Eric Wong Subject: [PATCH] signal.c: avoid repeated disable/enable interrupt Date: Sat, 25 Oct 2014 08:30:26 +0000 Message-Id: X-Mailer: git-send-email 2.1.1.276.g4636a05.dirty List-Id: We only install system-level signal handlers during init (before any threads or user code is running), so there's no need to repeatedly enable/disable the interrupts at that time. We also do not change system-level sig handlers once user-level code is running. This saves about 20 syscalls at startup and makes the executable smaller (numbers from 32-bit x86): text data bss dec hex filename before: 2815726 12100 30552 2858378 2b9d8a ruby after: 2815022 12100 30552 2857674 2b9aca ruby Conflicts: signal.c --- signal.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/signal.c b/signal.c index 85e01bf..5098b8d 100644 --- a/signal.c +++ b/signal.c @@ -1298,15 +1298,12 @@ install_sighandler(int signum, sighandler_t handler) { sighandler_t old; - /* At this time, there is no subthread. Then sigmask guarantee atomics. */ - rb_disable_interrupt(); old = ruby_signal(signum, handler); if (old == SIG_ERR) return -1; /* signal handler should be inherited during exec. */ if (old != SIG_DFL) { ruby_signal(signum, old); } - rb_enable_interrupt(); return 0; } #ifndef __native_client__ @@ -1319,7 +1316,6 @@ init_sigchld(int sig) { sighandler_t oldfunc; - rb_disable_interrupt(); oldfunc = ruby_signal(sig, SIG_DFL); if (oldfunc == SIG_ERR) return -1; if (oldfunc != SIG_DFL && oldfunc != SIG_IGN) { @@ -1328,7 +1324,6 @@ init_sigchld(int sig) else { GET_VM()->trap_list[sig].cmd = 0; } - rb_enable_interrupt(); return 0; } # ifndef __native_client__ @@ -1405,6 +1400,9 @@ Init_signal(void) rb_alias(rb_eSignal, rb_intern_const("signm"), rb_intern_const("message")); rb_define_method(rb_eInterrupt, "initialize", interrupt_init, -1); + /* At this time, there is no subthread. Then sigmask guarantee atomics. */ + rb_disable_interrupt(); + install_sighandler(SIGINT, sighandler); #ifdef SIGHUP install_sighandler(SIGHUP, sighandler); @@ -1448,4 +1446,6 @@ Init_signal(void) #elif defined(SIGCHLD) init_sigchld(SIGCHLD); #endif + + rb_enable_interrupt(); } -- EW