C 如何在Ruby扩展中的VALUE*数组上完成标记?
我有一个矩阵类型,它包含一个C 如何在Ruby扩展中的VALUE*数组上完成标记?,c,ruby,garbage-collection,ruby-c-extension,C,Ruby,Garbage Collection,Ruby C Extension,我有一个矩阵类型,它包含一个void*数组,表示一个对象数组(在给定的矩阵中都是一种类型,例如,所有C整数、所有浮点、双精度、各种结构,甚至可能是所有Ruby值s) 在我尝试创建一个VALUEs矩阵之前,内存分配和垃圾回收似乎都能正常工作 我定义了以下标记函数: void mark_dense_storage(void* s) { size_t i; DENSE_STORAGE* storage = (DENSE_STORAGE*)s; if (storage &&
void*
数组,表示一个对象数组(在给定的矩阵中都是一种类型,例如,所有C整数、所有浮点、双精度、各种结构,甚至可能是所有Ruby值
s)
在我尝试创建一个VALUE
s矩阵之前,内存分配和垃圾回收似乎都能正常工作
我定义了以下标记函数:
void mark_dense_storage(void* s) {
size_t i;
DENSE_STORAGE* storage = (DENSE_STORAGE*)s;
if (storage && storage->dtype == RUBY_OBJECT)
for (i = 0; i < count_dense_storage_elements(s); ++i)
rb_gc_mark(*((VALUE*)(storage->elements + i*sizeof(VALUE)));
}
nm\u id\u mult
是在myInit
函数中定义为rb\u intern(“*”
的全局变量
这可能不是垃圾收集问题,但GC是Ruby中我最不了解的部分——我的segfault也几乎与之相同,poster将其归为GC
所以,我的问题是:
VALUE
s数组的合适方法是什么值的一个示例
换句话说,在尝试访问a
之前,请确保执行*(VALUE*)a=INT2FIX(0)
我仍然认为这个问题是相关的。我还没有在StackOverflow或其他地方找到任何关于清洁和清扫垃圾收集标记的好例子。如果您能提供这样一个示例和/或解释,我将把它标记为这个问题的正确答案。Ruby的标记和扫描GC分两个阶段工作
第一阶段标记活动对象。它通过调用每个已知“活动对象”的标记函数递归工作。通过扫描每个已知Ruby线程或每个注册的全局对象的C堆栈(有一个C函数来注册/注销“已知的活动”对象),可以生成活动对象的初始集合。然后,对象X的标记函数应该为X引用的每个对象调用rb_gc_mark。换句话说,你所做的正是你应该做的
但是,正如您稍后注意到的,没有任何可能的值是有效的Ruby对象。但是,我相信用Qnil(即nil)初始化会更像ruby。它是ruby 1.9.3p0(2011-10-30修订版33570)。因此,首先我将升级到ruby 1.9.3-p125,并检查问题是否仍然存在。p0中的GC存在一些问题。p125仍然存在该问题。我在gist中添加了gdb输出:嗯,您也可以尝试1.9.2-p290-我有一个类似的问题,在1.9.3-p0和1.9.3-p125中都存在。不,1.9.2-p290也不好。除了现在它不知道当前帧是什么函数:#0 0x0000bb69英寸??()
,从st\u lookup
调用=(
C[i+j*ldc] = rb_funcall(C[i+j*ldc], nm_id_mult, 1, beta); // C[i+j*ldc] = C[i+j*ldc]*beta