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 2024 ExpyDoc