diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-26 15:17:01 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-26 15:17:01 +0000 |
commit | 5b238e8dc7fd55622c4e0a382b9783648ba412f5 (patch) | |
tree | cb62cd650a66ab8a95bdfb15881ba11209a30b41 /thread.c | |
parent | 23d5c282b4df78b5f6b8684c0d9f5aece7dd3f70 (diff) | |
download | ruby-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
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -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); } |