From: SASADA Koichi Date: 2008-12-15T22:44:31+09:00 Subject: [ruby-dev:37448] [Bug: trunk] GC from blocking region  ささだです. U.Nakamura wrote:: > こんにちは、なかむら(う)です。 > > In message "[ruby-dev:37381] Re: Ruby開発ミーティングログ" > on Dec.11,2008 13:44:58, wrote: >>> - Bug #755 [ruby-core:19946]: Windows specific. うささんに聞く (akr) >> 対応パッチを作ってこの問題が解決するところまではたどり着いて >> るのですが、メモリ関連のバグを仕込んでいるらしく別のテストで >> [BUG]るようになってしまったので困っているところです。 >> 誰かパッチのバグを探してくれる人がいるならそのパッチを出しま >> すが... > > これ、原因わかりました。 > > blocking region内でGCが発生すると、blocing regionじゃないスレ > ッド(なんか名前ないかな)のスタックが一切markされないため、そ > のスレッドでスタック上にあるVALUEが回収されてしまいます。 > 対策としては、 > > (1) blocking regionからGCが起こされたときはblocking regionじゃ > ないスレッドを止めてそのスレッドのスタックをmarkしてGCを > 続行させる。 > → 無理がありそう > > (2) blocking regionからGCを起こさせない > > (a) xmalloc等は使用禁止とする > → 面倒なのではないか > > (b) blocking regionからxmalloc等が呼ばれたときはメモリ確保 > できなくてもGCしない > > といったあたりがIRCでは出ました。 (c) blocking_region の中で,さらに ruby な環境にさわれる状態になり(GVL を取得する),メモリ確保を行う,ということが考えられます.性能はもちろん 落ちますが(使いどころを間違えると,とてもとても遅くなります),どーして も必要な場合は使う,ってことが出来るかと思います. -- // SASADA Koichi at atdot dot net