yarv-dev:927
From: 雪見酒 <yukimi_sake mbi.nifty.com>
Date: Sat, 18 Feb 2006 10:06:50 +0900
Subject: [yarv-dev:927] Re: SizedQueue#push don't work on yarv-r436
雪見酒です。 SASADA Koichi wrote: > すみません、よく確認してないんですが、動かないという確認は何かでできま > すか? テストとか。この辺はまだあまりきちんとしていないので、あると助か > ります。 まず、素の状態で D:\yarv\test>ruby -e "require 'thread'; SizedQueue.new(10).push(nil)" D:/yarv/lib/ruby/1.9/thread.rb:297:in `method_missing': undefined method `unlock_and_sleep' for #<Mutex:0x2b45798> (NoMethodError) from D:/yarv/lib/ruby/1.9/thread.rb:297:in `push' from -e:1:in `<main>' thread.cを調べると、こんな関数はないから、unlock_and_stopのtypoだろうと いうことで、297行目を変更。再度 D:\yarv\test>ruby -e "require 'thread'; SizedQueue.new(10).push(nil)" ・・今度は帰ってこない。Ctrl-Cは何回か打つと効く。 リファレンスによると、 >queue のサイズが max に達している場合は、 queue のサイズが max より >小さくなるまで他のスレッドに実行を譲ります。その後、 queue に obj >を追加します。 だから295行目のbreak if @que.length >= @maxは明らかに比較演算子の向きが 逆。で、これを修正して、 D:\yarv\test>ruby -e "require 'thread'; SizedQueue.new(10).push(nil)" D:/yarv/lib/ruby/1.9/thread.rb:148:in `synchronize': deadlock; recursive locking (ThreadError) from D:/yarv/lib/ruby/1.9/thread.rb:148:in `push' from D:/yarv/lib/ruby/1.9/thread.rb:299:in `push' from -e:1:in `<main>' これは mutex.lockした状態でsuperしているから継承元の mutex.synchronize{} が上記ののエラーを吐く。つまりsuperは使えないから、自前で処理を書かない といけない。 ということで、そのパッチに至ったわけです。 -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
915 2006-02-17 22:06 [yukimi_sake mbi.nift] SizedQueue#push don't work on yarv-r436 916 2006-02-17 22:13 ┣[yukimi_sake mbi.nift] open> SizedQueue#push don't work on yarv-r436 917 2006-02-17 22:23 ┃┗[yukimi_sake mbi.nift] 921 2006-02-17 23:54 ┗[ko1 atdot.net ] -> 927 2006-02-18 10:06 ┗[yukimi_sake mbi.nift] 928 2006-02-19 01:20 ┗[aamine loveruby.net ] fixed> Re: SizedQueue#push don't work on yarv-r436