summaryrefslogtreecommitdiff
path: root/thread_sync.c
diff options
context:
space:
mode:
authorJean byroot Boussier <jean.boussier+github@shopify.com>2022-11-08 20:43:16 +0900
committerGitHub <noreply@github.com>2022-11-09 00:43:16 +1300
commiteacedcfe44a0ae22bf54ddb7df193c48d4c857c6 (patch)
treee96392be3a51bf6778354387404af65bae709458 /thread_sync.c
parentcdb3ec3af84ce5ab1ae9c2bd72f8f0a29620f580 (diff)
downloadruby-eacedcfe44a0ae22bf54ddb7df193c48d4c857c6.tar.gz
mutex: Raise a ThreadError when detecting a fiber deadlock (#6680)
[Bug #19105] If no fiber scheduler is registered and the fiber that owns the lock and the one that try to acquire it both belong to the same thread, we're in a deadlock case. Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
Diffstat (limited to 'thread_sync.c')
-rw-r--r--thread_sync.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/thread_sync.c b/thread_sync.c
index 2bcf59137e..2f43896cfb 100644
--- a/thread_sync.c
+++ b/thread_sync.c
@@ -327,6 +327,10 @@ do_mutex_lock(VALUE self, int interruptible_p)
}
}
else {
+ if (!th->vm->thread_ignore_deadlock && rb_fiber_threadptr(mutex->fiber) == th) {
+ rb_raise(rb_eThreadError, "deadlock; lock already owned by another fiber belonging to the same thread");
+ }
+
enum rb_thread_status prev_status = th->status;
rb_hrtime_t *timeout = 0;
rb_hrtime_t rel = rb_msec2hrtime(100);