From: yamazaki <yamazaki / nal.go.jp>
Subject: [ruby-ext:00641] (gtk) testgtk/ctree (Ruby/GTK SNAPSHOT-19991129)
Date: Thu, 2 Dec 1999 12:25:52 +0900 (JST)

> testgtk/ctree.rb のバグが気になるので、調べています。
> 
> layout を出さず、ctree だけでも何回か出すと落ちます。

おや〜、と思ってやってみると、ゆれがあるし‥‥。

> [ruby-ext:00600] の patch なんですが、row.destroy というのは、
> CListRow のメンバの GtkDestroyNotify destroy; ではないでしょうか。
> これは、void (*GtkDestoyNotify)(gpointer data); という関数ポインタ
> で、node_set_row_data メソッドで設定したときは NULL になるようです。

「row.dataに自分で dataを入れたときには、memory leakを避けるために自前で
row.dataを freeしなければならないので GCにそれをさせるために markしてい
る」と言うのが自分の理解なんですが、あってますか?

上記が真であったときに、Ruby/Gtkでは以下の関数で

static VALUE
ctree_node_set_row_data(self, node, data)
     VALUE self, node, data;
{
    gtk_ctree_node_set_row_data(GTK_CTREE(get_widget(self)),
				get_ctree_node(node),
				(gpointer)data);
    bind_ctree_node(self, node);
    return self;
}

row.dataに VALUEをわたしているので、markすべきですよね?
で、row.data == NULLだと、Gtk自前の関数で freeと‥。

> 結局このパッチだと、常に真となって、変わらないように思います。
> (相変わらず落ちる) そちらではうまくいっているのでしょうか。

常に真とならないのは、

    if (GTK_CTREE_ROW(node) && GTK_CTREE_ROW(node)->row.data
	&& ! GTK_CTREE_ROW(node)->row.destroy) {
 	rb_gc_mark(GTK_CTREE_ROW(node)->row.data);
    } else {
	g_print("node not marked\n");
    }

な、事をしてもらえれば、わかると思いますが、ゆれてます(涙)

# そしてゆれがあるやつにかぎって、debugはじめると落ちないでやんの‥。

p.s. structの方、まだためしてません、ごめんなさい。
     しかも、grep struct *.hで、でたなんて‥‥‥‥(__;;
--
            yashi