MRubyでGCに解放されないようにするには
お世話になります。
MRubyの拡張機能をc++で作っています。
C++のコードに含まれるMRubyオブジェクトをGCで解放されないようにしたいです。
CRubyのときは
VALUE Data_Wrap_Struct(VALUE klass, RUBY_DATA_FUNC mark, RUBY_DATA_FUNC free, void *sval)
で引数markにマーク用関数を指定できましたが、MRubyを見ると
#define Data_Wrap_Struct(mrb,klass,type,ptr) mrb_data_object_alloc(mrb,klass,ptr,type)
引数markがありません。
どこでどうやってマークを付ければ良いでしょうか?
C++側の構造は簡単に書くと以下のようになっています。
class A
{
mrb_value mrb_object;
};
class B
{
A* a;
mrb_value mrb_object;
};
class C
{
B* b;
mrb_value mrb_object;
}
BクラスのaはC++側でmrb_mallocとData_Wrap_Structで作成されます。
更にmrb_gc_mark_value()を呼び出してマークしています。
問題の出るRubyコード
b = B.new
c = C.new
c.b = b
GC.start
p c.b.a
GC.startでaが解放されてしまい、c.b.aにアクセスするとメモリアクセス例外になってしまいます。
GCで解放されないためにはどうしたらよいでしょうか?