aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-26 15:17:01 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-26 15:17:01 +0000
commit5b238e8dc7fd55622c4e0a382b9783648ba412f5 (patch)
treecb62cd650a66ab8a95bdfb15881ba11209a30b41
parent23d5c282b4df78b5f6b8684c0d9f5aece7dd3f70 (diff)
downloadruby-5b238e8dc7fd55622c4e0a382b9783648ba412f5.tar.gz
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37867 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--NEWS10
-rw-r--r--thread.c15
3 files changed, 31 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index e89f99aeec..f4214eae04 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Nov 27 00:13:41 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * 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@gmail.com>
* NEWS: update for Thread#join incompatible change.
diff --git a/NEWS b/NEWS
index 61ab041883..ac7adc3761 100644
--- a/NEWS
+++ b/NEWS
@@ -105,6 +105,12 @@ with all sufficient information, see the ChangeLog file.
* 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 @@ with all sufficient information, see the ChangeLog file.
* Thread#join
See above.
+
+ * Mutex#lock, Mutex#unlock, Mutex#try_lock, Mutex#synchronize and Mutex#sleep
+
+ See above.
diff --git a/thread.c b/thread.c
index 3fb97d2342..878464186e 100644
--- a/thread.c
+++ b/thread.c
@@ -4051,6 +4051,11 @@ rb_mutex_trylock(VALUE self)
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_unlock(VALUE self)
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 @@ mutex_sleep(int argc, VALUE *argv, VALUE self)
{
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);
}