小松です。

In the message of [ruby-list:16861] Re: irb-0.6.0 deadlock (Re: Ruby 1.4.2)
    on 1999/9/18 09:56:50 matz / netlab.co.jp (Yukihiro Matsumoto) wrote:
||ハングの方は、eval.cはrb_thread_schedule()でEBADFを期待していて
||いるのに、win32/win32.cのmyselect()がWSAENOTSOCKを返しているため
||無限ループになっているようです。
|
|なる。このメールにはeval.cに対するパッチと、win32.cに対する
|パッチの両方が含まれていますが、これはwin32.cに対するものだ
|けを取り込めば良いんですか?

うーん、win32.cはまだ手を入れなきゃならいのですが、ハングする
よりはいいか。win32.cの方だけ取り込んでください。
eval.cの方は、一時的な物です。

	/	/	/

ところで、[ruby-list:15168]のdeadlockの例で試した時の、エラー
メッセージの出方の違いの原因はなんだろう?

[Solaris 2.5.1]
% cp /dev/null x
% ruby -v ruby-list-15168.rb x
ruby 1.4.2 (1999-09-17) [sparc-solaris2.5.1]
ruby-list-15168.rb:18: warning: assignment in condition
/usr/local/lib/ruby/1.4/thread.rb:151:deadlock 0x55368: 1:0 (main)
ruby-list-15168.rb:10:in `pop': Thread: deadlock (fatal)
        from /usr/local/lib/ruby/1.4/thread.rb:146:in `loop'
        from /usr/local/lib/ruby/1.4/thread.rb:146:in `pop'
        from ruby-list-15168.rb:16
% 

[2000 Professional β3]
C:\lang\ruby>copy nul x
        1 個のファイルをコピーしました。

C:\lang\ruby>ruby -v ruby-list-15168.rb x
ruby 1.4.2 (1999-09-17) [i386-mswin32]
ruby-list-15168.rb:18: warning: assignment in condition
ruby-list-15168.rb:10:deadlock 0x6c66e8: 1:1
C:/usr/local/lib/ruby/1.4/thread.rb:151:deadlock 0x6d5c70: 1:0 (main)
C:/usr/local/lib/ruby/1.4/thread.rb:151:deadlock 0x6d5c70: 1:0 (main)
ruby-list-15168.rb:10:in `(null)': Thread: deadlock (fatal)
        from ruby-list-15168.rb:10

C:\lang\ruby>

#!/usr/local/bin/ruby # ruby ruby-list-15168.rb /etc/motd require "thread" q = Queue.new Thread.start { while gets q.push $_ end } while TRUE while line = q.pop print line end end -- 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>