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って難しいねぇ
世界が単一のオブジェクトシステムで統一され
れば良いのに
© Copyright 2026 ExpyDoc