ruby-gnome2におけるgc問題

10
Ruby-GNOME2 にににに GC にに にに にに に ? Ruby-GNOME2 ににに

Upload: masahiro-sakai

Post on 27-Jun-2015

1.278 views

Category:

Technology


4 download

DESCRIPTION

Ruby-GNOME2におけるGC問題

TRANSCRIPT

Page 1: Ruby-GNOME2におけるGC問題

Ruby-GNOME2 における GC 問題

酒井 政裕元 ? Ruby-GNOME2 開発者

Page 2: Ruby-GNOME2におけるGC問題

背景 参照カウント

gtk+ など、使っているライブラリは多い 循環参照は NG

マークアンドスイープ Ruby の GC はこれ 循環参照も OK

拡張ライブラリでは連携が必要 しかし両方にまたがる循環参照は NG

Page 3: Ruby-GNOME2におけるGC問題

このボタンはGC 出来ない

簡単な具体例def hello_button b = Button.new b.signal_connect(“clicked”){ puts “Hello World” } bendhello_button()

Page 4: Ruby-GNOME2におけるGC問題

何が起こっているか ? – 参照関係

GtkButton GClosure

Button Proc

ruby 側

gtk 側

変数 b

循環参照

Page 5: Ruby-GNOME2におけるGC問題

ruby の GC からどう見えるか

GtkButton GClosure

Button Proc

ruby 側

gtk 側gtk 側 :

(1) 参照関係が見えない(2) GC の root になる

Page 6: Ruby-GNOME2におけるGC問題

対処法 原理的な方法

ruby or gtk+ に手を入れる 例 ) gtk 側の参照関係をトラバースする API たぶん非現実的

Ruby-GNOME2 では 両方に跨る循環を無理やり無くして対処 須藤さんのアイディア 具体的には……

Page 7: Ruby-GNOME2におけるGC問題

Ruby-GNOME2 では (1):gtk 側から ruby 側への参照を無くす

GtkButton GClosure

Button Proc

ruby 側

gtk 側

この参照を削除し循環を無くす

Page 8: Ruby-GNOME2におけるGC問題

Ruby-GNOME2 では (2):gtk 側の参照関係を ruby 側で模倣

GtkButton GClosure

Button Proc

ruby 側

gtk 側

GCからの保護に必要

Page 9: Ruby-GNOME2におけるGC問題

Ruby-GNOME2 では (3) 両方に跨る循環を ruby 側だけの循環に これならば ruby は GC できる !

問題点 実際には模倣は原理的なものではなく、ただの近似。 gtk が保障していない条件に依存。

現在の gtk の範囲では問題は起こらないはずだが、それ以外ではエラーが起こる可能性も……

これは「危険側に倒した」デザイン 個人的には、あまりよろしくないと思うが……

Page 10: Ruby-GNOME2におけるGC問題

おわりに 今回紹介した以外のバリエーションも有り 他の拡張ライブラリ

イベントハンドラを扱えば同様の問題は起こりうる

特に他の GUI ツールキットはどのように対処しているのか ?

GC って難しいねぇ 世界が単一のオブジェクトシステムで統一

されれば良いのに