Ruby-GNOME2におけるGC問題

1,505 views

Published on

Ruby-GNOME2におけるGC問題

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,505
On SlideShare
0
From Embeds
0
Number of Embeds
46
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Ruby-GNOME2におけるGC問題

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

×