バグ #1370
完了設定を開くたびに、抽出タブの設定ウィジェットがメモリリークしている
説明
#1367 で発見した問題から分岐
問題¶
設定画面を開いている間だけではなく、一度でも開いた後なら閉じてもクラッシュするのは、 Plugin::Extract::ExtractTabList がメモリリークしており、Pluggaloidイベントハンドラが開放されていないからです。
source:core/plugin/settings/menu.rb@cca427d1#L63 で、設定メニューを作るためにPhantomを使って一度設定を組み立てさせているのがウィジェットのリークの原因となっています。
PhantomはForm DSLの全てのインスタンスメソッドを提供し、どのようなメソッド呼び出しにもMOCKを返すMOCKを返します。結果として、pack_start等にもたんにMOCKを返すだけなので、destroyイベントが発生することなくメモリリークします。
すると、 source:core/plugin/extract/extract.rb@cca427d1#L101 のdestroyイベントハンドラが呼ばれず、 Plugin::Extract::ExtractTabList が開放されません。
解決策¶
以下のようなコードで、設定画面が開いている間だけPluggaloidイベントをListenできるようにしてはどうか。
Plugin.create(:test) do
settings('テスト') do
on_update do |s, ms| do
...
end
end
end
前々から思っていたが、Setting DSLで設定を開いている間だけイベントリスナを登録するのが面倒であるという問題が解決できる。Setting DSLのコンテキストに書いたものが設定を開いている間だけ有効というのは直感的だと思う。
更に、 問題 に挙げたPhantomの機能によって、メニューを作る時にはこれらのイベントリスナは一切登録されることがないため、これを実装して利用すれば解決する。