[#47562] [Backport 200 - Backport #8716][Open] segmation fault 正規表現で大量のグループを利用時 — "taka-yoshi (taka-yoshi taka)" <smokeonthewater222@...>

15 messages 2013/08/01

[#47569] [ruby-trunk - Feature #8726][Open] Class#source_location — "takiuchi (Genki Takiuchi)" <genki@...21g.com>

14 messages 2013/08/03

[#47663] Re: [ruby-core:56878] [ruby-trunk - misc #8835][Open] Introducing a semantic versioning scheme and branching policy — "Akinori MUSHA" <knu@...>

At Fri, 30 Aug 2013 21:49:34 +0900,

6 messages 2013/08/30

[ruby-dev:47618] [ruby-trunk - Bug #8749] Readline.readline stops STDOUT?

From: "akr (Akira Tanaka)" <akr@...>
Date: 2013-08-12 12:21:46 UTC
List: ruby-dev #47618
Issue #8749 has been updated by akr (Akira Tanaka).

File readline-release-gvl.patch added

何通か書いたメールが redmine に登録されていないので redmine で書きます。
(メールは (化けてますが) https://www.ruby-forum.com/topic/4416224 で見れます。)

読み込みでブロックしている時に GVL を解放していなくて他のスレッドが動けないようです。

readline_getc は Ruby 1.8 時代の名残りか、
Ruby の IO 読み込み関数 (rb_io_getbyte) を使うことによって
読み込みでブロックしている最中も他のスレッドを動かせるようにしていますが、
それには IO オブジェクトが必要なため、IO オブジェクトがないときは無理だとか
中途半端です。

その判断のところが r42402 で変化してしまって、他のスレッドが動けなくなっていた
のですが、Ruby 1.9 以降では、GVL を外して読み込めばブロック中に
他のスレッドは動けるのでそうするのがいいんじゃないでしょうか。

readline-release-gvl.patch みたいなのはどうですかね。

なお、シグナルがきたときに
rb_thread_call_with_gvl 経由で rb_thread_check_ints を呼んでいますが、
rb_thread_interrupted を使うと設定した trap が即座には起動しなかったためです。
これは私の想定する rb_thread_interrupted の動作と違うんですが、私の理解と
rb_thread_interrupted のどちらが間違っているのかは分かりません。

----------------------------------------
Bug #8749: Readline.readline stops STDOUT?
https://bugs.ruby-lang.org/issues/8749#change-41109

Author: no6v (Nobuhiro IMAI)
Status: Open
Priority: Normal
Assignee: 
Category: ext
Target version: 
ruby -v: ruby 2.1.0dev (2013-08-06 trunk 42402) [x86_64-linux]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
r42402 で、以下のようなスクリプトの挙動が変わっています。
(Enter を押すかどうかは関係なくて、)Readline.readline を実行中に標準出力への出力が出来なくなっているように見えます。

 $ cat rl.rb
 require "readline"
 
 th = Thread.new do
   p Readline.readline("> ")
 end
 
 loop do
   p :hi
   sleep 2
   break unless th.alive?
 end
 $ ruby -v rl.rb
 ruby 2.1.0dev (2013-08-06 trunk 42401) [x86_64-linux]
 :hi
 > :hi
 :hi
 :hi
 :hi
               # しばらく放置してここで Enter
 ""
 $ ruby -v rl.rb
 $ /tmp/ruby/bin/ruby -v /tmp/r.rb 
 ruby 2.1.0dev (2013-08-06 trunk 42402) [x86_64-linux]
 :hi
 >             # しばらく放置してここで Enter
 ""
 $ 
=end



-- 
http://bugs.ruby-lang.org/

In This Thread