いがらしです。

[ruby-list:16799]で報告されていたメモリリークについてです。

GdkPixmapを含めたGdkDrawableをrubyオブジェクトにする場合
make_gdkdrawで無条件にgdk_{window,pixmap,bitmap}_refしていました
が、GdkPixmap等をgdk_pixmap_new等で生成した時点でref_countは1に
なっているので、rubyオブジェクトのGC時にunrefしてもGdkDrawableは
解放されていませんでした。

そこで生成と取得を区別して、
[生成]
VALUE new_gdkxxxx(pointer)
    wrapする。
    gdk_object_listに登録する。
    オブジェクトを返す。
[取得]
VALUE make_gdkxxxx(pointer)
    もしgdk_object_listにあったらそれを返す。
    もしgdk_object_listになかったら、
        gdk_xxxx_ref(pointer);
        return new_gdkxxxx(pointer);

としてみました。
gdk_object_listはGdkDrawable*からVALUEへの写像です。
rubyオブジェクトのGC時にdelete_gdkxxxxで対応関係は取り除かれます。

これによりあるGdkDrawable*に対して同じrubyオブジェクトを返すよう
になります。

この変更を含めたスナップショットをいつもの場所に置いてあります。
問題がありましたらご指摘下さい。

--
五十嵐  宏  (Hiroshi IGARASHI)