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

ruby-changes:25810

From: kosaki <ko1@a...>
Date: Tue, 27 Nov 2012 00:17:13 +0900 (JST)
Subject: [ruby-changes:25810] kosaki:r37867 (trunk): * thread.c (rb_mutex_trylock, rb_mutex_unlock, mutex_sleep):

kosaki	2012-11-27 00:17:01 +0900 (Tue, 27 Nov 2012)

  New Revision: 37867

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

  Log:
    * thread.c (rb_mutex_trylock, rb_mutex_unlock, mutex_sleep):
      raises ThreadError if called from trap handler as Thread#join.
    * NEWS: news fot the above.

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/thread.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37866)
+++ ChangeLog	(revision 37867)
@@ -1,3 +1,9 @@
+Tue Nov 27 00:13:41 2012  KOSAKI Motohiro  <kosaki.motohiro@g...>
+
+	* thread.c (rb_mutex_trylock, rb_mutex_unlock, mutex_sleep):
+	  raises ThreadError if called from trap handler as Thread#join.
+	* NEWS: news fot the above.
+
 Mon Nov 26 23:55:33 2012  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* NEWS: update for Thread#join incompatible change.
Index: thread.c
===================================================================
--- thread.c	(revision 37866)
+++ thread.c	(revision 37867)
@@ -4051,6 +4051,11 @@
     VALUE locked = Qfalse;
     GetMutexPtr(self, mutex);
 
+    /* When running trap handler */
+    if (GET_THREAD()->interrupt_mask & TRAP_INTERRUPT_MASK) {
+	rb_raise(rb_eThreadError, "can't be called from trap context");
+    }
+
     native_mutex_lock(&mutex->lock);
     if (mutex->th == 0) {
 	mutex->th = GET_THREAD();
@@ -4239,6 +4244,11 @@
     rb_mutex_t *mutex;
     GetMutexPtr(self, mutex);
 
+    /* When running trap handler */
+    if (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);
 
@@ -4307,6 +4317,11 @@
 {
     VALUE timeout;
 
+    /* When running trap handler */
+    if (GET_THREAD()->interrupt_mask & TRAP_INTERRUPT_MASK) {
+	rb_raise(rb_eThreadError, "can't be called from trap context");
+    }
+
     rb_scan_args(argc, argv, "01", &timeout);
     return rb_mutex_sleep(self, timeout);
 }
Index: NEWS
===================================================================
--- NEWS	(revision 37866)
+++ NEWS	(revision 37867)
@@ -105,6 +105,12 @@
       * Module#const_get accepts a qualified constant string, e.g.
         Object.const_get("Foo::Bar::Baz")
 
+  * Mutex
+    * incompatible changes:
+      * Mutex#lock, Mutex#unlock, Mutex#try_lock, Mutex#synchronize
+        and Mutex#sleep no longer allows to be used from trap handler.
+	Now it raises ThreadError.
+
   * NilClass
     * added method:
       * added nil.to_h which returns {}
@@ -350,3 +356,7 @@
   * Thread#join
    
     See above.
+
+  * Mutex#lock, Mutex#unlock, Mutex#try_lock, Mutex#synchronize and Mutex#sleep
+
+    See above.

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

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