aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-19 09:43:53 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-19 09:43:53 +0000
commit58282ed667d720816366c9e45c3560904196d078 (patch)
tree6f3f88443f75e507f31de9ece79228daf670229d
parent92cef134b54fadb79e5d338a3aea1b51ff500386 (diff)
downloadruby-58282ed667d720816366c9e45c3560904196d078.tar.gz
* signal.c (sig_signame): implements Signal.signame method
[Feature #5613] * test/ruby/test_signal.rb (test_signame): adds test for above * NEWS: add an item about above git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37723 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--NEWS3
-rw-r--r--signal.c21
-rw-r--r--test/ruby/test_signal.rb18
4 files changed, 49 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index c85aa5eb5d..ee3e01e6d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Tue Nov 20 08:36:15 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * signal.c (sig_signame): implements Signal.signame method
+ [Feature #5613]
+ * test/ruby/test_signal.rb (test_signame): adds test for above
+ * NEWS: add an item about above
+
Mon Nov 19 16:30:59 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* struct.c (rb_struct_each_pair): yield associated pairs so that
diff --git a/NEWS b/NEWS
index 77efc123ab..6fb1b97e89 100644
--- a/NEWS
+++ b/NEWS
@@ -105,6 +105,9 @@ with all sufficient information, see the ChangeLog file.
* added Range#bsearch for binary search.
* Signal
+ * added method:
+ * added Signal.signame which returns signal name
+
* incompatible changes:
* Signal.trap raises ArgumentError when :SEGV, :BUS, :ILL, :FPE, :VTALRM
are specified.
diff --git a/signal.c b/signal.c
index e0f1872bef..2bb22b5e71 100644
--- a/signal.c
+++ b/signal.c
@@ -207,6 +207,26 @@ signo2signm(int no)
return 0;
}
+/*
+ * call-seq:
+ * Signal.signame(signo) -> string
+ *
+ * convert signal number to signal name
+ *
+ * Signal.trap("INT") { |signo| puts Signal.signame(signo) }
+ * Process.kill("INT", 0)
+ *
+ * <em>produces:</em>
+ *
+ * INT
+ */
+static VALUE
+sig_signame(VALUE recv, VALUE signo)
+{
+ const char *signame = signo2signm(NUM2INT(signo));
+ return rb_str_new_cstr(signame);
+}
+
const char *
ruby_signal_name(int no)
{
@@ -1086,6 +1106,7 @@ Init_signal(void)
rb_define_global_function("trap", sig_trap, -1);
rb_define_module_function(mSignal, "trap", sig_trap, -1);
rb_define_module_function(mSignal, "list", sig_list, 0);
+ rb_define_module_function(mSignal, "signame", sig_signame, 1);
rb_define_method(rb_eSignal, "initialize", esignal_init, -1);
rb_define_method(rb_eSignal, "signo", esignal_signo, 0);
diff --git a/test/ruby/test_signal.rb b/test/ruby/test_signal.rb
index 0e3af06d7b..eaf21b8f2d 100644
--- a/test/ruby/test_signal.rb
+++ b/test/ruby/test_signal.rb
@@ -240,4 +240,22 @@ EOS
}
end
+ def test_signame
+ return unless Process.respond_to?(:kill)
+
+ begin
+ 10.times do
+ caught = 0
+ signame = "wrong"
+
+ Signal.trap("INT") { |signo| signame = Signal.signame(signo); caught = 1; }
+ Process.kill("INT", 0)
+
+ sleep 0.01 while caught==0
+ assert_equal(signame, "INT")
+ end
+ ensure
+ Signal.trap("INT", "DEFAULT")
+ end
+ end
end