Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/rubyPublic

CI windows debugging: Bug 21398 ractor lock ordering issue hack#13851

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
jhawthorn wants to merge5 commits intoruby:master
base:master
Choose a base branch
Loading
fromjhawthorn:bug_21398_ractor_lock_ordering_issue_hack

Conversation

jhawthorn
Copy link
Member

No description provided.

luke-gruberand others added5 commitsJuly 8, 2025 15:38
…d_wakeup()In rb_ractor_sched_wait() (ex: Ractor.receive), we acquireRACTOR_LOCK(cr) and then thread_sched_lock(cur_th). However, on wakeupif we're a dnt, in thread_sched_wait_running_turn() we acquirethread_sched_lock(cur_th) after condvar wakeup and then RACTOR_LOCK(cr).This lock inversion can cause a deadlock with rb_ractor_wakeup_all()(ex: port.send(obj)), where we acquire RACTOR_LOCK(other_r) and thenthread_sched_lock(other_th).So, the error happens:nt 1:   Ractor.receive            rb_ractor_sched_wait() after condvar wakeup in thread_sched_wait_running_turn():              - thread_sched_lock(cur_th) (condvar) # acquires lock              - rb_ractor_lock_self(cr) # deadlock here: tries to acquire, HANGSnt 2: port.send            ractor_wakeup_all()              - RACTOR_LOCK(port_r) # acquires lock              - thread_sched_lock # tries to acquire, HANGSOne solution would be to rework `thread_sched_wait_running_turn()` with DNT's. I didn'tdo this because it would be a bigger architectural change. What I changed is to unlockRACTOR_LOCK before calling rb_ractor_sched_wakeup() in a pthread env. In a non-pthreadenv it's safe to hold this lock, and we should.Script that reproduces issue:```rubyrequire "async"class RactorWrapper  def initialize@Ractor = Ractor.new do      Ractor.recv # Ractor doesn't start until explicitly told to      # Do some calculations      fib = ->(x) { x < 2 ? 1 : fib.call(x - 1) + fib.call(x - 2) }      fib.call(20)    end  end  def take_async    @ractor.send(nil)    Thread.new { @ractor.value }.value  endendAsync do |task|  10_000.times do |i|    task.async do      RactorWrapper.new.take_async      puts i    end  endendexit 0```Fixes [Bug #21398]
@launchable-appLaunchable app
Copy link

launchable-appbot commentedJul 10, 2025
edited
Loading

Tests Failed

✖️no tests failed ✔️61861 tests passed(4 flakes)

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers
No reviews
Assignees
No one assigned
Labels
None yet
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

2 participants
@jhawthorn@luke-gruber

[8]ページ先頭

©2009-2025 Movatter.jp