diff options
author | Jean byroot Boussier <jean.boussier+github@shopify.com> | 2022-11-08 20:43:16 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-09 00:43:16 +1300 |
commit | eacedcfe44a0ae22bf54ddb7df193c48d4c857c6 (patch) | |
tree | e96392be3a51bf6778354387404af65bae709458 /thread_sync.c | |
parent | cdb3ec3af84ce5ab1ae9c2bd72f8f0a29620f580 (diff) | |
download | ruby-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.c | 4 |
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); |