[前][次][番号順一覧][スレッド一覧]

ruby-changes:30827

From: kosaki <ko1@a...>
Date: Wed, 11 Sep 2013 08:21:27 +0900 (JST)
Subject: [ruby-changes:30827] kosaki:r42906 (trunk): * thread.c (rb_mutex_unlock): Mutex#unlock no longer raise

kosaki	2013-09-11 08:21:17 +0900 (Wed, 11 Sep 2013)

  New Revision: 42906

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=42906

  Log:
    * thread.c (rb_mutex_unlock): Mutex#unlock no longer raise
      an exception even if uses on trap. [Bug #8891]

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_thread.rb
    trunk/thread.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 42905)
+++ ChangeLog	(revision 42906)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Sep 11 07:55:17 2013  KOSAKI Motohiro  <kosaki.motohiro@g...>
+
+	* thread.c (rb_mutex_unlock): Mutex#unlock no longer raise
+	  an exception even if uses on trap. [Bug #8891]
+
 Tue Sep 10 14:37:01 2013  Shota Fukumori  <sorah@t...>
 
 	* vm_backtrace.c (vm_backtrace_to_ary): Ignore the second argument if
Index: thread.c
===================================================================
--- thread.c	(revision 42905)
+++ thread.c	(revision 42906)
@@ -4481,11 +4481,6 @@ rb_mutex_unlock(VALUE self) https://github.com/ruby/ruby/blob/trunk/thread.c#L4481
     rb_mutex_t *mutex;
     GetMutexPtr(self, mutex);
 
-    /* When running trap handler */
-    if (!mutex->allow_trap && GET_THREAD()->interrupt_mask & TRAP_INTERRUPT_MASK) {
-	rb_raise(rb_eThreadError, "can't be called from trap context");
-    }
-
     err = rb_mutex_unlock_th(mutex, GET_THREAD());
     if (err) rb_raise(rb_eThreadError, "%s", err);
 
Index: test/ruby/test_thread.rb
===================================================================
--- test/ruby/test_thread.rb	(revision 42905)
+++ test/ruby/test_thread.rb	(revision 42906)
@@ -849,6 +849,23 @@ Thread.new(Thread.current) {|mth| https://github.com/ruby/ruby/blob/trunk/test/ruby/test_thread.rb#L849
     end
   end
 
+  def test_mutex_unlock_on_trap
+    assert_in_out_err([], <<-INPUT, %w(locked unlocked false), [])
+      m = Mutex.new
+
+      Signal.trap("INT") { |signo|
+        m.unlock
+        puts "unlocked"
+      }
+
+      m.lock
+      puts "locked"
+      Process.kill("INT", $$)
+      sleep 0.01
+      puts m.locked?
+    INPUT
+  end
+
   def invoke_rec script, vm_stack_size, machine_stack_size, use_length = true
     env = {}
     env['RUBY_THREAD_VM_STACK_SIZE'] = vm_stack_size.to_s if vm_stack_size

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]