我有几个结构与 Data_Wrap_Struct 绑定到ruby对象,我还提供了mark()和free()函数。
当我手动启动GC或只是等到它跳入我的红宝石物体时就被杀死了。 到目前为止没什么新鲜事。
奇怪的是:当我尝试使用 rb_gc_register_address ()保护这些对象时,没有任何反应 - 我的对象仍会被杀死。
我只能通过以下方式阻止GC执行此操作:
objects = rb_ary_new();
rb_gc_register_address(&objects);
rb_ary_push(objects, data);
这是唯一的方法,为什么我不能只使用 rb_gc_register_address ()?
答案 0 :(得分:1)
看了一眼,似乎所有类型都排成一行(你要回到VALUE并传入VALUE ptr)所以我的猜测是标记操作没有正确标记对象而扫描阶段正在抢夺他们了。
也许通过将子对象包装在具有正确标记功能的数组中,可以保护数据对象。
这更像是一个理论,而不是一个可靠的答案,但也许这是一个开始的东西。 :)
不,具有讽刺意味的是,回过头来深入挖掘Ruby GC。期待一些招聘人员的哇。 :d
- 编辑 -
要添加到此,我只是在gc.c中挖掘,在第1098行,您要失败的精确测试是
if(!(p-> as.basic.flags& FL_MARK))
所以你必须在你的标记功能中包含你的旗帜FL_MARK,这样扫地机就不会......呃......扫你。