[前][次][番号順一覧][スレッド一覧][生データ]

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