I am running into a problem with to C extension objects and I’m not sure
what I’m missing. I put together a simple example illustrating the point
here:
https://github.com/linterra/ruby-c-ext-gc
Basically one C extension class (child) references another (parent). To
keep parent from being GC’d before the child referencing it, I assign a
reference in the child using rb_ivar_set(). Additionally, I also add a
mark
function in the child to mark the parent.
Still, when GC runs, the parent still gets cleaned up first and the
child
GC segfaults because it references the GC’d parent. I can see that the
child’s mark function is being called.
So I am not sure what I am missing. What should I be doing to make sure
the
child keeps a valid reference to the parent to ensure that it (parent)
is
not GC’d before child?
I have tested this on Ruby 1.9.3 latest. 1.9.1 also exhibits the same
behavior. 1.8.6 It does not exhibit this behavior, but apparently
because
it does not GC the child at all.
Any help would be greatly appreciated.
Mike