From: Tanaka Akira Date: 2003-05-20T19:29:26+09:00 Subject: [ruby-dev:20251] Re: dyna_vars problem? In article <1053424909.383731.24667.nullmailer@picachu.netlab.jp>, matz@ruby-lang.org (Yukihiro Matsumoto) writes: > そうです。それでちょっと分かってきました。スレッドデバッグの > とも、printfデバッグを駆使することによって原因が分かってきま > した。 > > * thread_save_contextが行われる > * thread_restore_contextが行われる > * もう一度thread_restore_contextが行われる > > という状況が発生していて、最初のrestoreによる実行で、 > dyna_varsが解放されてしまうと、ダメということのようです。 > > しかし、continuation以外で一つのsaveに複数のrestoreが対応す > ることはないように作ったつもりだったんですが。 よくわかってませんが、例の gc を入れたところで finalizer が動いて、 finalizer の中でさらに thread が context switch するあたりではなかろう かと疑っています。 > とりあえずCVS最新ではforce_recycleを禁止してみましたので、こ > れで様子を見てくださいませ。 rb_gc() も入っているのはデバッグには都合がよくて便利です。が、意図せざ るものではないかと思います。 実行してみたところ、(運が良かった時に)終了したような時間が経っても終ら ないので、まだ(まだ)なにか変なところがあるんじゃないかという気がします。 % time ruby -d o [#, 0, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1042004759/l50"}] [#, 1, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1004873294/l50"}] [#, 2, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1020682294/l50"}] [#, 3, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1013846140/l50"}] [#, 4, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1012445015/l50"}] [#, 5, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1037527388/l50"}] [#, 6, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1001950590/l50"}] removing /tmp/open-uri3194.3...done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done done [#, 7, {"URI"=>"http://pc2.2ch.net/test/read.cgi/tech/1048030962/l50"}] Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired Exception `Resolv::ResolvTimeout' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired Exception `TimeoutError' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired /home/akr/ruby/lib/ruby/1.8/timeout.rb:37:in `pop': execution expired (TimeoutError) from /home/akr/ruby/lib/ruby/1.8/resolv.rb:465:in `each_resource' from /home/akr/ruby/lib/ruby/1.8/resolv.rb:465:in `timeout' from /home/akr/ruby/lib/ruby/1.8/resolv.rb:465:in `each_resource' from /home/akr/ruby/lib/ruby/1.8/resolv.rb:455:in `resolv' from /home/akr/ruby/lib/ruby/1.8/resolv.rb:792:in `each' from /home/akr/ruby/lib/ruby/1.8/resolv.rb:792:in `resolv' from /home/akr/ruby/lib/ruby/1.8/resolv.rb:791:in `each' from /home/akr/ruby/lib/ruby/1.8/resolv.rb:791:in `resolv' ... 29 levels... from o:14:in `times' from o:14:in `concurrent_map' from o:74:in `main' from o:87 Exception `TimeoutError' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired removing /tmp/open-uri3194.0...done Exception `TimeoutError' at /home/akr/ruby/lib/ruby/1.8/timeout.rb:37 - execution expired * なぜいきなり done がたくさん出て来るのか、 * なぜ -d をつけていて、例外が起きているようなのにも関わらずプロセスが 終了しないのか、 など、おもわず眉をひそめてしまう要素が満載です。 (それが Ruby のバグとは限りませんが。) -- [田中 哲][たなか あきら][Tanaka Akira]