https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2021-07-07T18:35:23Z
Ruby Issue Tracking System
Ruby master - Bug #18023: Ractor#make_shareable changes the values of closured shareable objects
https://bugs.ruby-lang.org/issues/18023?journal_id=92812
2021-07-07T18:35:23Z
slowpilot (Ivan Razuvaev)
<ul></ul><p>slowpilot (Ivan Razuvaev) wrote:</p>
<blockquote>
<p>Hi. I encountered strange behaviour or shareable procs when every even closured shareable variable becomes the FalseClass instance.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="n">usr</span><span class="vi">@srvr</span> <span class="o">~</span><span class="p">]</span><span class="err">$</span> <span class="n">irb</span>
<span class="mf">3.0</span><span class="o">.</span><span class="mi">1</span> <span class="p">:</span><span class="mo">001</span> <span class="o">></span> <span class="n">v1</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">v3</span><span class="p">,</span> <span class="n">v4</span> <span class="o">=</span> <span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="ss">:c</span><span class="p">,</span> <span class="ss">:d</span>
<span class="o">=></span> <span class="p">[</span><span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="ss">:c</span><span class="p">,</span> <span class="ss">:d</span><span class="p">]</span>
<span class="mf">3.0</span><span class="o">.</span><span class="mi">1</span> <span class="p">:</span><span class="mo">002</span> <span class="o">></span> <span class="nb">p</span> <span class="o">=</span> <span class="no">Proc</span><span class="p">.</span><span class="nf">new</span> <span class="p">{</span> <span class="nb">p</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">v3</span><span class="p">,</span> <span class="n">v4</span> <span class="p">}</span>
<span class="o">=></span> <span class="c1">#<Proc:0x000000000248ed18 (irb):2> </span>
<span class="mf">3.0</span><span class="o">.</span><span class="mi">1</span> <span class="p">:</span><span class="mo">003</span> <span class="o">></span> <span class="nb">p</span><span class="o">.</span><span class="p">()</span>
<span class="ss">:a</span>
<span class="ss">:b</span>
<span class="ss">:c</span>
<span class="ss">:d</span>
<span class="o">=></span> <span class="p">[</span><span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="ss">:c</span><span class="p">,</span> <span class="ss">:d</span><span class="p">]</span>
<span class="mf">3.0</span><span class="o">.</span><span class="mi">1</span> <span class="p">:</span><span class="mo">004</span> <span class="o">></span> <span class="no">Ractor</span><span class="p">.</span><span class="nf">make_shareable</span><span class="p">(</span><span class="nb">p</span><span class="p">)</span><span class="o">.</span><span class="p">()</span>
<span class="ss">:a</span>
<span class="kp">false</span>
<span class="ss">:c</span>
<span class="kp">false</span>
<span class="o">=></span> <span class="p">[</span><span class="ss">:a</span><span class="p">,</span> <span class="kp">false</span><span class="p">,</span> <span class="ss">:c</span><span class="p">,</span> <span class="kp">false</span><span class="p">]</span>
</code></pre>
</blockquote>
<p>This is stopping from using dynamically defined methods from ractors. E.g. in Ruby <a href="https://github.com/orlando-labs/torch.rb/blob/2c8c1c89ded3ac924a19020d6c747582d1c828cc/lib/torch.rb#L256" class="external">libtorch</a>. So after calling rb_ext_ractor_safe in extension, I am trying to do something like:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">cls</span><span class="p">.</span><span class="nf">define_singleton_method</span><span class="p">(</span><span class="s1">'new'</span><span class="p">,</span> <span class="no">Ractor</span><span class="p">.</span><span class="nf">make_shareable</span><span class="p">(</span><span class="no">Proc</span><span class="p">.</span><span class="nf">new</span> <span class="p">{</span> <span class="o">...</span> <span class="p">})</span>
</code></pre>
<p>That leads to every second closure assignment to false.</p>
Ruby master - Bug #18023: Ractor#make_shareable changes the values of closured shareable objects
https://bugs.ruby-lang.org/issues/18023?journal_id=94036
2021-10-06T19:38:52Z
alanwu (Alan Wu)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>Applied in changeset <a class="changeset" title="Fix Ractor.make_shareable changing locals for Procs env_copy() uses rb_ary_delete_at() with a lo..." href="https://bugs.ruby-lang.org/projects/ruby-master/repository/git/revisions/76228191474c76810043b294a74bbb2f1808b3d9">git|76228191474c76810043b294a74bbb2f1808b3d9</a>.</p>
<hr>
<p>Fix Ractor.make_shareable changing locals for Procs</p>
<p>env_copy() uses rb_ary_delete_at() with a loop counting up while<br>
iterating through the list of read only locals. rb_ary_delete_at() can<br>
shift elements in the array to an index lesser than the loop index,<br>
causing locals to be missed and set to Qfalse in the returned<br>
environment.</p>
<p>Iterate through the locals in reverse instead, this way the shifting<br>
never happens for locals that are yet to be visited and we process all<br>
the locals in the array.</p>
<p>[Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Ractor#make_shareable changes the values of closured shareable objects (Closed)" href="https://bugs.ruby-lang.org/issues/18023">#18023</a>]</p>
Ruby master - Bug #18023: Ractor#make_shareable changes the values of closured shareable objects
https://bugs.ruby-lang.org/issues/18023?journal_id=94099
2021-10-09T04:49:58Z
nagachika (Tomoyuki Chikanaga)
nagachika00@gmail.com
<ul><li><strong>Backport</strong> changed from <i>2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN</i> to <i>2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED</i></li></ul>
Ruby master - Bug #18023: Ractor#make_shareable changes the values of closured shareable objects
https://bugs.ruby-lang.org/issues/18023?journal_id=94153
2021-10-16T04:55:56Z
nagachika (Tomoyuki Chikanaga)
nagachika00@gmail.com
<ul><li><strong>Backport</strong> changed from <i>2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED</i> to <i>2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONE</i></li></ul><p>ruby_3_0 5427b08381fb0d644ec69d5aa94234f90a4fbed1 merged revision(s) 76228191474c76810043b294a74bbb2f1808b3d9.</p>