Ruby-GNOME2におけるGC問題 - 酒井 政裕 (SAKAI Masahiro)

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