お世話になります。

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で解放されないためにはどうしたらよいでしょうか?