aboutsummaryrefslogtreecommitdiffstats
path: root/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c15
1 files changed, 15 insertions, 0 deletions
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);
}