从C库中保存Ruby对象,避免被垃圾回收

时间:2015-03-06 13:44:14

标签: c ruby collections swig garbage

我有一种情况需要从C结构中保存对Ruby对象(VALUE的实例)的引用 SOLELY ;即,创建Ruby对象并将其传递给C库。

目前,Ruby对象保持有效,只要在我的Ruby应用程序的某个地方,其他东西也引用该对象。但是只要C结构对该对象的唯一引用,垃圾收集就会重新获得它,因为标记和扫描不再能够找到它。

我需要一种让这些物体保持活力的方法;即,我希望它们能够存在,直到释放C结构或者删除对象的引用为止。

1 个答案:

答案 0 :(得分:0)

对不起,自从我跟进这件事以来已经有一段时间了。最后。

我曾尝试将Ruby对象附加到C结构的Swig包装器,但Swig并不保证这些包装器是幂等的。 IOW,如果我有一个C结构的包装器,然后要求对同一个结构的另一个引用,那么两个包装器是不同的对象,并没有等同。

此外,如果Swig包装器对象超出范围,即使C结构不是GC,参考也会消失,我的Ruby对象也会被收集。

最后,解决方案是创建一个Ruby哈希并挂钩C库生命周期事件;即,当引用Ruby对象的C结构为GC'd时,则从散列中删除Ruby对象。

最后,这是实现这一目标的唯一方法。