Upload
masahiro-sakai
View
1.278
Download
4
Embed Size (px)
DESCRIPTION
Ruby-GNOME2におけるGC問題
Citation preview
Ruby-GNOME2 における GC 問題
酒井 政裕元 ? Ruby-GNOME2 開発者
背景 参照カウント
gtk+ など、使っているライブラリは多い 循環参照は NG
マークアンドスイープ Ruby の GC はこれ 循環参照も OK
拡張ライブラリでは連携が必要 しかし両方にまたがる循環参照は NG
このボタンはGC 出来ない
簡単な具体例def hello_button b = Button.new b.signal_connect(“clicked”){ puts “Hello World” } bendhello_button()
何が起こっているか ? – 参照関係
GtkButton GClosure
Button Proc
ruby 側
gtk 側
変数 b
循環参照
ruby の GC からどう見えるか
GtkButton GClosure
Button Proc
ruby 側
gtk 側gtk 側 :
(1) 参照関係が見えない(2) GC の root になる
対処法 原理的な方法
ruby or gtk+ に手を入れる 例 ) gtk 側の参照関係をトラバースする API たぶん非現実的
Ruby-GNOME2 では 両方に跨る循環を無理やり無くして対処 須藤さんのアイディア 具体的には……
Ruby-GNOME2 では (1):gtk 側から ruby 側への参照を無くす
GtkButton GClosure
Button Proc
ruby 側
gtk 側
この参照を削除し循環を無くす
Ruby-GNOME2 では (2):gtk 側の参照関係を ruby 側で模倣
GtkButton GClosure
Button Proc
ruby 側
gtk 側
GCからの保護に必要
Ruby-GNOME2 では (3) 両方に跨る循環を ruby 側だけの循環に これならば ruby は GC できる !
問題点 実際には模倣は原理的なものではなく、ただの近似。 gtk が保障していない条件に依存。
現在の gtk の範囲では問題は起こらないはずだが、それ以外ではエラーが起こる可能性も……
これは「危険側に倒した」デザイン 個人的には、あまりよろしくないと思うが……
おわりに 今回紹介した以外のバリエーションも有り 他の拡張ライブラリ
イベントハンドラを扱えば同様の問題は起こりうる
特に他の GUI ツールキットはどのように対処しているのか ?
GC って難しいねぇ 世界が単一のオブジェクトシステムで統一
されれば良いのに