Project

General

Profile

バグ #1370

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

Added by toshi_a 初音 about 2 months ago. Updated about 2 months ago.

Status:
終了
Priority:
通常
Target version:
プラグイン名:
ブランチ:
クラッシュする:
No

Description

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

Associated revisions

Revision e8d70c4e (diff)
Added by toshi_a 初音 about 2 months ago

Setting DSLの中でイベントリスナとフィルタを定義可能にする refs #1370

Revision 53f74c09 (diff)
Added by toshi_a 初音 about 2 months ago

Setting DSLの中でイベントリスナを定義する refs #1370

Revision 0a5ac103 (diff)
Added by toshi_a 初音 about 2 months ago

設定画面を切り替えた時にウィジェットを破棄する refs #1370

History

#1

Updated by toshi_a 初音 about 2 months ago

  • Status changed from 実装待ち to 終了

merged.

Also available in: Atom PDF