ruby-changes:35575
From: nobu <ko1@a...>
Date: Sun, 21 Sep 2014 11:03:42 +0900 (JST)
Subject: [ruby-changes:35575] nobu:r47657 (trunk): signal.c: EINVAL is a failure
nobu 2014-09-21 11:03:34 +0900 (Sun, 21 Sep 2014) New Revision: 47657 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=47657 Log: signal.c: EINVAL is a failure * signal.c (ruby_signal): although "EINVAL from sigaction(2) is not a bug", but even it is a failure. pointed at toRuby/guRuby in RubyHiroba. Modified files: trunk/ChangeLog trunk/signal.c trunk/test/ruby/test_signal.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 47656) +++ ChangeLog (revision 47657) @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sun Sep 21 11:03:32 2014 Nobuyoshi Nakada <nobu@r...> + + * signal.c (ruby_signal): although "EINVAL from sigaction(2) is + not a bug", but even it is a failure. pointed at toRuby/guRuby + in RubyHiroba. + Sat Sep 20 03:00:26 2014 Masaki Matsushita <glass.saga@g...> * lib/tempfile.rb: define parameters appropriately and some Index: test/ruby/test_signal.rb =================================================================== --- test/ruby/test_signal.rb (revision 47656) +++ test/ruby/test_signal.rb (revision 47657) @@ -169,6 +169,14 @@ class TestSignal < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_signal.rb#L169 end end if Process.respond_to?(:kill) + %w"KILL STOP".each do |sig| + if Signal.list.key?(sig) + define_method("test_trap_uncatchable_#{sig}") do + assert_raise(Errno::EINVAL, "SIG#{sig} is not allowed to be caught") { Signal.trap(sig) {} } + end + end + end + def test_kill_immediately_before_termination Signal.list[sig = "USR1"] or sig = "INT" assert_in_out_err(["-e", <<-"end;"], "", %w"foo") Index: signal.c =================================================================== --- signal.c (revision 47656) +++ signal.c (revision 47657) @@ -258,6 +258,18 @@ ruby_signal_name(int no) https://github.com/ruby/ruby/blob/trunk/signal.c#L258 return signo2signm(no); } +static VALUE +rb_signo2signm(int signo) +{ + const char *const signm = signo2signm(signo); + if (signm) { + return rb_sprintf("SIG%s", signm); + } + else { + return rb_sprintf("SIG%u", signo); + } +} + /* * call-seq: * SignalException.new(sig_name) -> signal_exception @@ -290,13 +302,7 @@ esignal_init(int argc, VALUE *argv, VALU https://github.com/ruby/ruby/blob/trunk/signal.c#L302 sig = argv[1]; } else { - signm = signo2signm(signo); - if (signm) { - sig = rb_sprintf("SIG%s", signm); - } - else { - sig = rb_sprintf("SIG%u", signo); - } + sig = rb_signo2signm(signo); } } else { @@ -600,8 +606,12 @@ ruby_signal(int signum, sighandler_t han https://github.com/ruby/ruby/blob/trunk/signal.c#L606 } (void)VALGRIND_MAKE_MEM_DEFINED(&old, sizeof(old)); if (sigaction(signum, &sigact, &old) < 0) { - if (errno != 0 && errno != EINVAL) { - rb_bug_errno("sigaction", errno); + int e = errno; + if (e == EINVAL) { + rb_syserr_fail_str(e, rb_signo2signm(signum)); + } + else if (e != 0) { + rb_bug_errno("sigaction", e); } } if (old.sa_flags & SA_SIGINFO) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/