https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2010-04-22T21:31:10Z
Ruby Issue Tracking System
Ruby master - Bug #3182: multi-irb may run parallelly
https://bugs.ruby-lang.org/issues/3182?journal_id=10440
2010-04-22T21:31:10Z
keiju (Keiju Ishitsuka)
keiju@ishitsuka.com
<ul></ul><p>=begin<br>
けいじゅ@いしつかです.</p>
<p>In <a href="/issues/3182">[ruby-dev:41031]</a> the message: "<a href="/issues/3182">[ruby-dev:41031]</a> [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: multi-irb may run parallelly (Closed)" href="https://bugs.ruby-lang.org/issues/3182">#3182</a>]<br>
multi-irb may run parallelly", on Apr/21 20:54(JST) Yusuke Endoh<br>
writes:</p>
<blockquote>
<p>いしつかさん<br>
遠藤です。</p>
</blockquote>
<blockquote>
<p>私の環境で再現はしないのですが、同じ手順を実行すると、kill したあとで、<br>
キー入力が不思議な挙動になりました。</p>
<p>irb(main):001:0> irb String<br>
irb#1(String):001:0> irb Array<br>
irb#2(Array):001:0> kill String<br>
=> #<IRB::Irb: @context=#<a href="IRB::Context:0x84096bc" class="external">IRB::Context:0x84096bc</a>, @signal_status=:IN_EVAL, @scanner=#<a href="RubyLex:0x84080a0" class="external">RubyLex:0x84080a0</a>><br>
irb(main):002:0> => [String]<br>
irb#2(Array):002:0> j<br>
NameError: undefined local variable or method <code>j' for main:Object from (irb):2 from ../ruby-trunk-local/bin/irb:12:in </code>'<br>
irb(main):003:0> obs<br>
NameError: undefined local variable or method <code>obs' for main:Object from (irb):3 from ../ruby-trunk-local/bin/irb:12:in </code>'</p>
</blockquote>
<blockquote>
<p>SEGV はおいといて、複数の irb スレッドが走りだすのは multi-irb のバグ<br>
だと思います。</p>
</blockquote>
<p>確かに.</p>
<blockquote>
<p>irb が終了したときに、親の irb スレッドを run するコードがありますが、<br>
kill された時は kill した irb スレッドがすでに走っているので、親を run<br>
させるべきでないと思います。</p>
<p>以下のように、kill された irb 一覧を保持しておいて、kill された irb の<br>
終了時には親を起こさないようにしたところ、不思議な挙動はなくなりまし<br>
た。</p>
</blockquote>
<p>確かにこれでもよい気がしますが, 単純に その終了するsubirbがカレントジョ<br>
ブの時のみカレントジョブの置き換えをするようにするで十分なようです. こ<br>
ちらのパッチを採用したいと思います.</p>
<p>--- lib/irb/ext/multi-irb.rb (リビジョン 27443)<br>
+++ lib/irb/ext/multi-irb.rb (作業コピー)<br>
@@ -172,12 +172,14 @@<br>
ensure<br>
unless system_exit<br>
@JobManager.delete(irb)</p>
<ul>
<li>if parent_thread.alive?</li>
<li>
<pre><code> @JobManager.current_job = @JobManager.irb(parent_thread)
</code></pre>
</li>
<li>
<pre><code> parent_thread.run
</code></pre>
</li>
<li>else</li>
<li>
<pre><code> @JobManager.current_job = @JobManager.main_irb
</code></pre>
</li>
<li>
<pre><code> @JobManager.main_thread.run
</code></pre>
</li>
</ul>
<ul>
<li>if @JobManager.current_job == irb</li>
<li>
<pre><code> if parent_thread.alive?
</code></pre>
</li>
<li>
<pre><code> @JobManager.current_job = @JobManager.irb(parent_thread)
</code></pre>
</li>
<li>
<pre><code> parent_thread.run
</code></pre>
</li>
<li>
<pre><code> else
</code></pre>
</li>
<li>
<pre><code> @JobManager.current_job = @JobManager.main_irb
</code></pre>
</li>
<li>
<pre><code> @JobManager.main_thread.run
</code></pre>
</li>
<li>
<pre><code> end
</code></pre>
end<br>
end<br>
end</li>
</ul>
<p>__<br>
---------------------------------------------------->> 石塚 圭樹 <<---<br>
---------------------------------->> e-mail: <a href="mailto:keiju@ishitsuka.com" class="email">keiju@ishitsuka.com</a> <<---</p>
<p>=end</p>
Ruby master - Bug #3182: multi-irb may run parallelly
https://bugs.ruby-lang.org/issues/3182?journal_id=10441
2010-04-22T21:57:06Z
keiju (Keiju Ishitsuka)
keiju@ishitsuka.com
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
This issue was solved with changeset r27444.<br>
Yusuke, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<p>=end</p>