プロジェクト

全般

プロフィール

バグ #1370

完了

設定を開くたびに、抽出タブの設定ウィジェットがメモリリークしている

toshi_a 初音 さんが4年以上前に追加. 4年以上前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
プラグイン名:
ブランチ:
クラッシュする:
いいえ

説明

#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の機能によって、メニューを作る時にはこれらのイベントリスナは一切登録されることがないため、これを実装して利用すれば解決する。

他の形式にエクスポート: Atom PDF