From 5b238e8dc7fd55622c4e0a382b9783648ba412f5 Mon Sep 17 00:00:00 2001 From: kosaki Date: Mon, 26 Nov 2012 15:17:01 +0000 Subject: * 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 --- ChangeLog | 6 ++++++ NEWS | 10 ++++++++++ thread.c | 15 +++++++++++++++ 3 files changed, 31 insertions(+) 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 + + * 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 * 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); } -- cgit v1.2.3