Project

General

Profile

Actions

バグ #1370

closed

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

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

Actions #1

Updated by toshi_a 初音 about 5 years ago

  • Status changed from 実装待ち to 終了

merged.

Actions

Also available in: Atom PDF